Jak wyświetlić zawartość binarną pliku natywnie w systemie Windows 7? (Czy to możliwe.)


35

Mam plik nieco większy niż 500 MB, który powoduje pewne problemy.

Uważam, że problem dotyczy przyjętej konwencji końca linii (EOL). Chciałbym spojrzeć na plik w nieinterpretowanej postaci surowej (1), aby potwierdzić konwencję EOL pliku.

Jak mogę wyświetlić „plik binarny” pliku za pomocą czegoś wbudowanego w system Windows 7? Wolałbym unikać pobierania dodatkowych plików.

(1) Mój współpracownik i ja otworzyliśmy plik w edytorach tekstów, a one pokazują wiersze tak, jak można się spodziewać. Ale oba edytory tekstu będą otwierać pliki z różnymi konwencjami EOL i interpretować je automatycznie. (TextEdit i Emacs 24.2. Dla Emacsa stworzyłem drugi plik z tylko pierwszymi bajtami 4K używanymi head -c4096na polu Linux i otworzyłem go z mojego okna Windows.

Próbowałem użyć trybu szesnastkowego w Emacsie, ale kiedy przeszedłem do trybu szesnastkowego i wróciłem do trybu tekstowego, zawartość bufora uległa zmianie, dodając widoczny ^ M na końcu każdej linii, więc nie jestem ufając temu w tej chwili.

Uważam, że problem może dotyczyć znaku (znaków) na końcu wiersza. Redakcja, z którą współpracowaliśmy z moim współpracownikiem (1), po prostu w sposób automatyczny rozpoznała konwencję końca linii i pokazała nam linie. Na podstawie innych dowodów uważam, że konwencja EOL dotyczy wyłącznie zwrotu karetki. (2) tylko powrót.

Aby wiedzieć, co faktycznie znajduje się w pliku, chciałbym spojrzeć na binarną zawartość pliku lub co najmniej kilka tysięcy bajtów pliku, najlepiej w formacie szesnastkowym, chociaż mógłbym pracować z dziesiętną lub ósemkową. Tylko zera byłyby dość szorstkie.

AKTUALIZACJA

Z wyjątkiem jednego sugerującego DEBUG, wszystkie poniższe odpowiedzi działają do pewnego stopnia. Głosowałem za każdym z nich jako pomocnym. Moje pytanie było źle sformułowane. Podczas testowania każdego sugerowanego rozwiązania stwierdziłem, że naprawdę chciałem wyświetlać obok siebie szesnastkę i zawartość tekstową, i że chciałbym, aby było to coś, w którym po najechaniu kursorem na coś, albo wartość bajtu, albo znak tekstu, pasującą rzecz na druga strona zostanie podświetlona.

Naprawdę rozwiązałem swój problem, gdy tryb heksowy Emacsa zaczął działać „poprawnie”. Skończyło się na tym, że nie użyłem żadnej z tych odpowiedzi, tylko je testowałem (naprawdę powinienem zbadać dziwne zachowanie Emacsa i złożyć raport o błędzie).


Pod Cygwin prawdopodobnie znajduje się jakieś narzędzie, ale wymagałoby to zainstalowania Cygwin. Lub jeśli masz np. Javę zainstalowaną na twoim urządzeniu, napisanie programu zrzutu szesnastkowego w Javie byłoby dość prostym zadaniem.
Daniel R Hicks,

Odpowiedzi:


11

Potrzebujesz „edytora szesnastkowego”. Używam „Hex Editor Neo” od lat i jest bardzo dobra. Jest dostępny w wersji bezpłatnej i płatnej . (I jestem pewien, że są dostępne inne podobne narzędzia).


4
Zapytałem, jak to zrobić bez niczego poza Windows 7, ponieważ nie lubię dodawać dodatkowych programów, ponieważ 1) Wielu instaluje się w sposób, który nie pozwala na prawa, które mam. 2) Niektórzy wyglądają na podejrzanych. To powiedziawszy, Redaktor Hex Neo wydaje się być dobrą rekomendacją. +1
Shannon Severance

1
zblist.com to samodzielny program, który nie wymaga instalacji ani specjalnych uprawnień i ma tryb Alt-H lub hex
sgmoore

Spełniłem wszystkie moje wymagania, w tym stwierdzone, zniekształcone, niepotwierdzone. Hex Editor Neo też był szybki i został dodany do mojej torby z narzędziami.
Shannon Severance

1. Inni redaktorzy nie są natywni. 2. Menedżery plików są odpowiednie do tego celu i istnieje wiele przenośnych plików. 3. Polecenie Type może wyświetlać treść natywnie i ma przydatne filtry (np. Strona po stronie).
Overmind

37

Jeśli masz PowerShell w wersji 5.0 lub nowszej, możesz skorzystać z powershellwbudowanej funkcjiFormat-Hex

PS:21 C:\Temp >Format-Hex application.exe

            0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F

00000000   42 4D 5E 00 00 00 00 00 00 00 36 00 00 00 28 00  BM^.......6...(. 
00000010   00 00 0A 00 00 00 01 00 00 00 01 00 20 00 00 00  ............ ... 
00000020   00 00 00 00 00 00 C4 0E 00 00 C4 0E 00 00 00 00  ......Ä...Ä..... 
00000030   00 00 00 00 00 00 B7 59 71 FF B7 59 71 FF B7 59  ......•Yq.•Yq.•Y 
00000040   71 FF B7 59 71 FF B7 59 71 FF B7 59 71 FF B7 59  q.•Yq.•Yq.•Yq.•Y 
00000050   71 FF B7 59 71 FF B7 59 71 FF B7 59 71 FF        q.•Yq.•Yq.•Yq.

4
Jestem szczerze zaskoczony, że nie jest to najlepsza odpowiedź. Jest to właściwy sposób, aby to zrobić za pomocą wbudowanego narzędzia w systemie Windows. Jeśli chcesz zapisać dane wyjściowe do pliku, możesz użyć> Format-Hex application.exe> ​​out.txt
techdude

To wydaje się miłe, ale Format-Hexnie jest dostępne w moim PowerShell; Po prostu pojawia się błąd „nierozpoznany”
Kidburla

Według JamieSee, najwidoczniej nie został dodany do PowerShell 5.0.
techdude

26

Wbudowany, szybki i brudny: uruchom powershell, uruchom:

gc -encoding byte -TotalCount 100 "your_file_path" |% {write-host ("{0:x}" -f $_) -noNewline " "}; write-host   

TotalCount to liczba bajtów, które chcesz odczytać z pliku.

Google „hexdump” PowerSumpa, aby uzyskać o wiele bardziej dopracowane / działające wersje.

Jeśli masz narzędzia Windows Resource Kit (niezupełnie wbudowane, ale zamknięte), możesz również użyć narzędzia linii cmd o nazwie list.exe. To mały edytor z trybem szesnastkowym. Zaprojektowany specjalnie do pracy z dużymi plikami:

Narzędzie listy plików tekstowych (Lista) to narzędzie wiersza polecenia, które wyświetla i wyszukuje jeden lub więcej plików tekstowych. W przeciwieństwie do innych narzędzi do wyświetlania tekstu, List nie odczytuje całego pliku do pamięci po jego otwarciu. Pozwala użytkownikowi edytować plik tekstowy w formacie szesnastkowym.

Lista jest przydatna do zdalnego wyświetlania plików tekstowych lub dzienników oraz do użytku na serwerach, na których administratorzy są zaniepokojeni spadkiem wydajności systemu.


1
Jak dotąd to rozwiązanie jest najbliższe, o które prosiłem.
Shannon Severance

1
Ładne, proste, już zainstalowane. Zmieniłem format na write-host („{0: X2}”, aby wymusić wyświetlanie 0x0A jako „0A”, a nie „A”, 2 na 2 cyfry, ponieważ tak to lubię
Adam Straughan,

1
Program List.exe był doskonały - list.exe /?polecenie pomocy nie zawiera zbyt wielu informacji, ale po wejściu do edytora wystarczy nacisnąć, ?aby zobaczyć polecenia. Hotwiera edytor Hex i F1przełącza sposób wyświetlania Hex
Coruscate5

7

Działa to również na wszystko po XP:

certutil -encodehex MyProgram.exe MyProgram.txt

XP wymaga pakietu narzędzi administracyjnych systemu Windows Server 2003 stąd:

https://www.microsoft.com/en-us/download/details.aspx?id=16770


najbardziej przenośne i kompatybilne z powrotem rozwiązanie w systemie Windows, może być używane nawet ze skryptów wsadowych systemu Windows, zdziwiony, dlaczego nadal nie jest na szczycie wszystkich odpowiedzi
Andry

6

Skopiuj plik do nazwy z .COMrozszerzeniem, gdzie podstawowa nazwa nie jest dłuższa niż osiem znaków. Biegać

DEBUG twoja_nazwa_pliku

Wyświetli się -monit „ ”. Rodzaj

DEnter

kilkakrotnie d WYŚWIETLACZ plik 128 bitów na raz. Rodzaj

D adres Enter

aby wyświetlić 128 bajtów zaczynających się od adresu , które należy wpisać szesnastkowo, gdzie początkiem pliku jest adres 100. Wpisz

D adres 1 adres 2 Enter

wyświetlać od adresu 1 do adresu 2 . Rodzaj

D adres Lnum Enter

wyświetlać liczbę bajtów (długość) zaczynając od adresuLiczba jest również wprowadzana w postaci szesnastkowej. Użyj, Qaby wyjść.

Na przykład,

C:\Users\scott\Documents> debug thispost.com
-d
0BE4:0100  43 6F 70 79 20 74 68 65-20 66 69 6C 65 20 74 6F   Copy the file to
0BE4:0110  20 61 20 6E 61 6D 65 20-77 69 74 68 20 61 20 2E    a name with a .
0BE4:0120  43 4F 4D 20 65 78 74 65-6E 73 69 6F 6E 2C 20 77   COM extension, w
0BE4:0130  68 65 72 65 20 74 68 65-20 62 61 73 65 20 6E 61   here the base na
0BE4:0140  6D 65 20 69 73 20 6E 6F-20 6C 6F 6E 67 65 72 20   me is no longer
0BE4:0150  74 68 61 6E 20 65 69 67-68 74 20 63 68 61 72 61   than eight chara
0BE4:0160  63 74 65 72 73 2E 0D 0A-52 75 6E 20 44 45 42 55   cters...Run DEBU
0BE4:0170  47 20 2A 79 6F 75 72 5F-66 69 6C 65 6E 61 6D 65   G *your_filename
-d
0BE4:0180  2A 0D 0A 49 74 20 77 69-6C 6C 20 67 69 76 65 20   *..It will give
0BE4:0190  61 20 27 2D 27 20 70 72-6F 6D 70 74 2E 0D 0A 54   a '-' prompt...T
0BE4:01A0  79 70 65 20 44 20 45 6E-74 65 72 20 72 65 70 65   ype D Enter repe
0BE4:01B0  61 74 65 64 6C 79 20 74-6F 20 2A 2A 64 2A 2A 69   atedly to **d**i
0BE4:01C0  73 70 6C 61 79 20 74 68-65 20 66 69 6C 65 20 31   splay the file 1
0BE4:01D0  32 38 20 62 79 74 65 73-20 61 74 20 61 20 74 69   28 bytes at a ti
0BE4:01E0  6D 65 2E 0D 0A 54 79 70-65 20 44 20 5F 61 64 64   me...Type D _add
0BE4:01F0  72 65 73 73 5F 20 74 6F-20 64 69 73 70 6C 61 79   ress_ to display
-d 200 L16
0BE4:0200  20 31 32 38 20 62 79 74-65 73 20 73 74 61 72 74    128 bytes start
0BE4:0210  69 6E 67 20 61 74                                 ing at
-

3
Niestety to nie zadziała, jeśli plik jest większy niż około 64 KB, maksimum dla pliku .COM. (Musi mieścić się w segmencie, zaczynając od przesunięcia 100h.)
Ken,

1
C:\>attrib debug.exe /s. Wyniki: File not found - debug.exe. Nie udało się znaleźć oficjalnego, debugowanie nie jest już obsługiwane , ale z tego, co widziałem w sieci, wygląda na to, że wsparcie debugowania zostało już jakiś czas temu usunięte. Znalazłem DebugDiag od Microsoft. (Dodatkowe pobieranie.) Debugowanie? Może obsługuje przeglądanie plików w formacie HEX? Dostarczony jako plik .MSI. Potrzebuje hasła administratora, aby zainstalować. Nie jestem jednym
Shannon Severance

@Ken Użyłem już head -c4096 bigFileName > smallFileNamena Linuksie, aby uzyskać pierwsze 4 KB plików. Linie są na tyle małe, że cztery KB mają dużo linii dla moich celów
Shannon Severance

Dlaczego więc nie używać hexdump -Cw systemie Linux?
Ken

3
Debugowanie @Shannon jest częścią DOS i jako takie, jeśli używasz x64, nie ma go.
kinokijuf


5

Ponieważ system Windows 7 ma wbudowane środowisko dotnet Framework 3.5, będziesz mieć wbudowany kompilator C #, dzięki czemu możesz na przykład pobrać listę z http://illegalargumentexception.blogspot.co.uk/2008/04/c- file-hex-dump-application.html, a następnie skompiluj za pomocą

  \windows\Microsoft.NET\Framework\v3.5\csc printhex.cs 

i powinieneś skończyć z printhex.exe, który powinien wyświetlać zarówno znaki szesnastkowe, jak i ascii.


Proste i nie ma potrzeby gigantycznego pobierania.
live-love

2

Nie jest to idealne rozwiązanie, ale jeśli naprawdę nie chcesz niczego pobierać, możesz spróbować użyć fc / b (tzn. Porównywania plików w trybie binarnym), aby porównać ten plik z innym całkowicie innym plikiem, a wyświetli się heks wartości każdego bajtu, który jest inny. Możesz otrzymać pewne wartości, które są takie same w dwóch plikach, a więc mogą zostać pominięte z danych wyjściowych, ale możesz stwierdzić, czy tak się dzieje, sprawdzając brakujące wartości w kolumnie przesunięcia.


Nie jest to idealne, ale udało mi się to, tworząc plik o wielkości 0x00 bajtów, a następnie porównując z tym. Będąc plikiem tekstowym, na który patrzyłem, i że interesowałem się 0a i 0d, to głównie plik zerowy, ponieważ porównanie działało. Ale nie zapewnia to zarówno widoku postaci, jak i widoku szesnastkowego obok siebie, dzięki czemu znalezienie miejsca, w którym chciałem spojrzeć mocniej. (Jak debugowanie w odpowiedzi Scotta i tryb szesnastkowy Emacsa. Nie prosiłem o widok obok siebie, ale ma to zasadnicze znaczenie dla tego, jak faktycznie używam zrzutów heksadecjalnych.)
Shannon Severance

2

Możesz użyć funkcji PowerShell poniżej wraz z Get-Content, aby zobaczyć zrzut heksowy zawartości pliku, tj Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump. Zrzut pliku 222 KB zajmuje około 23 sekund, a w razie potrzeby dane wyjściowe można przekierować do pliku tekstowego, aby ułatwić sprawdzenie zrzutu.

$encodingAutoCompleter = {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
    $availableEncodings = ([System.Text.Encoding]::GetEncodings() | Select Name, CodePage, DisplayName) + @( [PSCustomObject] @{ CodePage = '20127'; Name = 'ascii'; DisplayName = 'US-ASCII' }, [PSCustomObject] @{ CodePage = '1200'; Name = 'unicode'; DisplayName = 'Unicode' } )
    $availableEncodings | ?{ $_.Name.StartsWith($wordToComplete) } | %{ New-Object System.Management.Automation.CompletionResult -ArgumentList $_.Name, $_.Name, 'ParameterValue', "$($_.DisplayName). Code Page $($_.CodePage)." }
}

function Format-BufferText([byte[]] $buffer, [System.Text.Encoding] $displayEncoding, [switch] $useControlPictures)
{
    $bufferChars = $displayEncoding.GetChars($buffer);
    $bufferText = (($bufferChars | %{ if ([char]::IsControl($_) -eq $true) { if ($useControlPictures -eq $false) { '.' } else { [char] ($_.ToInt16([cultureinfo]::InvariantCulture) + 0x2400) } } else { "$_" } }) -join "")

    $bufferText
}

<#
    .Synopsis
    Displays binary data as a hexadecimal dump.

    .Description
     Displays binary data as a hexadecimal dump. Options are available to suppress displaying text and to display control characters 
     as Unicode Control Pictures instead of dots.

    .Parameter Bytes
    The bytes to be displayed.

    .Parameter Encoding
    The name of the text encoding to use. The default is ascii.

    .Parameter NoTextDisplay
    If specified the text display sidebar will be suppressed; otherwise, the display text sidebar will be present.

    .Parameter UseControlPictures
    If specified control characters will be displayed as Unicode Control pictures; otherwise, dots are used to represent control 
    characters.

    .Example
    Format-HexDump -Encoding unicode $bytes

    .Example
    Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump -Encoding unicode

    .Example
    0..255 | Format-HexDump -NoTextDisplay
#>
function Format-HexDump
{
    [CmdletBinding()]
    param
    (
        [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [byte[]] $Bytes,
        [ValidateScript({ if (([System.Text.Encoding]::GetEncodings().Name + @('unicode', 'ascii')) -icontains $_) { return $true } else { Throw "Encoding must be one of the following: $([System.Text.Encoding]::GetEncodings().Name -join ', '), unicode, or ascii." } })]
        [Parameter(ValueFromPipeline = $false)]
        [string] $Encoding = "ASCII",
        [Parameter()]
        [switch] $NoTextDisplay,
        [Parameter()]
        [switch] $UseControlPictures
    )

    BEGIN
    {
        $displayEncoding = [System.Text.Encoding]::GetEncoding($Encoding)

        $counter = 0
        $hexRow = ""
        [byte[]] $buffer = @()
    }

    PROCESS
    {
        foreach ($byte in $Bytes)
        {
            $buffer += $byte
            $hexValue = $byte.ToString("X2")

            if ($counter % 16 -eq 0)
            {
                $buffer = @($byte)
                $hexRow = "$($counter.ToString("X8")): $($hexValue) "
            }
            elseif ($counter % 16 -eq 15)
            {
                if ($NoTextDisplay -eq $true)
                {
                    $hexRow += "$($hexValue)"
                    $hexRow
                }
                else
                {
                    $bufferText = Format-BufferText $buffer $displayEncoding $UseControlPictures
                    $hexRow += "$($hexValue)   $($bufferText)"
                    $hexRow
                }
            }
            else
            {
                $hexRow += "$($hexValue) "
            }

            $counter++
        }
    }

    END
    {
        $counter--

        if ($counter % 16 -ne 15)
        {
            $hexRow += " " * (((16 - $counter % 16) * 3) - 1)

            if ($NoTextDisplay -eq $false)
            {
                $bufferText = Format-BufferText $buffer $displayEncoding $UseControlPictures
                $hexRow += "$($bufferText)"
            }

            $hexRow
        }
    }
}

Register-ArgumentCompleter -CommandName Format-HexDump -ParameterName Encoding -ScriptBlock $encodingAutoCompleter

Dane wyjściowe wyglądają następująco:

00000000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   ................
00000010: 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F   ................
00000020: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F    !"#$%&'()*+,-./
00000030: 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F   0123456789:;<=>?
00000040: 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F   @ABCDEFGHIJKLMNO
00000050: 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F   PQRSTUVWXYZ[\]^_
00000060: 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F   `abcdefghijklmno
00000070: 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F   pqrstuvwxyz{|}~.
00000080: 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F   ????????????????
00000090: 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F   ????????????????
000000A0: A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF   ????????????????
000000B0: B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF   ????????????????
000000C0: C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF   ????????????????
000000D0: D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF   ????????????????
000000E0: E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF   ????????????????
000000F0: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF   ????????????????

Lub po prostu użyj nazwy pliku Format-Hex
techdude

@techdude Format-Hex nie jest dostępny we wszystkich wersjach programu PowerShell. Nie istnieje w PowerShell 4 i wcześniejszych wersjach. Napisałem ten kod, zanim Format-Hex istniał.
JamieSee

Jak przywrócić to z powrotem do pliku binarnego?
Zimba


0

Wiem, że używasz Emacsa, ale użytkownicy Vima mogą korzystać z xxdnarzędzia:

xxd -s <start_offset> -l <length_offest> <file>

to znaczy

Usage:
       xxd.exe [options] [infile [outfile]]
    or
       xxd.exe -r [-s [-]offset] [-c cols] [-ps] [infile [outfile]]
Options:
    -a          toggle autoskip: A single '*' replaces nul-lines. Default off.
    -b          binary digit dump (incompatible with -ps,-i,-r). Default hex.
    -c cols     format <cols> octets per line. Default 16 (-i: 12, -ps: 30).
    -E          show characters in EBCDIC. Default ASCII.
    -g          number of octets per group in normal output. Default 2.
    -h          print this summary.
    -i          output in C include file style.
    -l len      stop after <len> octets.
    -ps         output in postscript plain hexdump style.
    -r          reverse operation: convert (or patch) hexdump into binary.
    -r -s off   revert with <off> added to file positions found in hexdump.
    -s [+][-]seek  start at <seek> bytes abs. (or +: rel.) infile offset.
    -u          use upper case hex letters.
    -v          show version: "xxd V1.10 27oct98 by Juergen Weigert (Win32)".
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.