2012-08-30 22:25:48 +0000 2012-08-30 22:25:48 +0000
37
37

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

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

Uważam, że problem tkwi w konwencji końca linii (EOL). Chciałbym spojrzeć na plik w jego niezinterpretowanej surowej formie (1), aby potwierdzić konwencję EOL pliku.

Jak mogę wyświetlić “binarny” plik używając czegoś wbudowanego w Windows 7? Wolałbym uniknąć konieczności pobierania czegokolwiek dodatkowego.

(1) Mój współpracownik i ja otworzyliśmy plik w edytorach tekstu, a one pokazują linie tak, jak można by się spodziewać. Ale oba edytory tekstu otworzą pliki z różnymi konwencjami EOL i zinterpretują je automatycznie. (TextEdit i Emacs 24.2. Dla Emacsa stworzyłem drugi plik z tylko pierwszymi 4K bajtami używając head -c4096 na linuxowym pudełku i otworzyłem go z mojego windowsowego pudełka.

Próbowałem użyć hexl-mode w Emacsie, ale kiedy przeszedłem do hexl-mode i z powrotem do text-mode, zawartość bufora zmieniła się, dodając widoczne ^M na końcu każdej linii, więc nie ufam temu w tej chwili.

Sądzę, że problem może leżeć w używanym znaku (znakach) końca linii. Redaktorzy, których próbowałem wraz z moim współpracownikiem (1), po prostu automatycznie rozpoznawali konwencję końca linii i pokazywali nam linie. I na podstawie innych dowodów uważam, że konwencja EOL to tylko powrót karetki. (2) tylko powrót.

Aby wiedzieć co tak naprawdę jest w pliku, chciałbym spojrzeć na binarną zawartość pliku, lub przynajmniej kilka tysięcy bajtów pliku, najlepiej w Hex, choć mógłbym pracować z dziesiętnymi lub ósemkowymi. Po prostu jedynki i zera byłyby dość szorstkie do oglądania.

UPDATE

Z wyjątkiem tego, który sugeruje DEBUG, wszystkie poniższe odpowiedzi działają w pewnym stopniu lub innym. Podniosłem głos każdego z nich jako pomocnego. Moje pytanie było źle sformułowane. Testując każde sugerowane rozwiązanie, stwierdziłem, że naprawdę chcę mieć podgląd zawartości heksów i tekstu obok siebie, i że chcę, aby to było coś, gdzie kiedy mam kursor nad czymś, albo wartość bajtu, albo znak tekstowy, pasująca rzecz po drugiej stronie byłaby podświetlona.

Właściwie rozwiązałem mój problem, gdy Emacs hexl-mode zaczął działać “poprawnie”. Więc skończyło się na tym, że nie używałem żadnej z tych odpowiedzi, tylko je testowałem.(Naprawdę powinienem zbadać dziwne zachowanie Emacsa i złożyć raport o błędach).

Odpowiedzi (11)

43
43
43
2017-09-06 05:04:26 +0000

Jeśli posiadasz powershell w wersji 5.0 lub nowszej, możesz użyć wbudowanej funkcji powershell Format-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.
```.
26
26
26
2012-08-31 00:35:08 +0000

Wbudowane, szybkie i brudne: start powershell, execute:

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 ‘powershell hexdump’, aby uzyskać o wiele bardziej spolszczone / działające wersje.

Jeśli masz Windows Resource Kit Tools (nie jest dokładnie wbudowany, ale blisko) możesz również użyć narzędzia linii cmd o nazwie list.exe. Jest to mały edytor z trybem heksadecymalnym. Zaprojektowany specjalnie do pracy z dużymi plikami:

List Text File Tool (List) jest narzędziem wiersza poleceń, które wyświetla i przeszukuje jeden lub więcej plików tekstowych. W przeciwieństwie do innych narzędzi do wyświetlania tekstu, List nie wczytuje całego pliku do pamięci po jego otwarciu. Pozwala użytkownikowi na edycję pliku tekstowego w formacie szesnastkowym.

List jest przydatny do zdalnego wyświetlania plików tekstowych lub dzienników oraz do stosowania na serwerach, gdzie administratorzy obawiają się spadku wydajności systemu.

11
11
11
2012-08-31 00:05:36 +0000

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

7
7
7
2018-09-06 00:15:24 +0000

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

certutil -encodehex MyProgram.exe MyProgram.txt

XP wymaga Windows Server 2003 Administration Tools Pack stąd : https://www.microsoft.com/en-us/download/details.aspx?id=16770

6
6
6
2012-08-30 23:48:49 +0000

Skopiuj plik do nazwy z rozszerzeniem .COM, gdzie nazwa podstawowa nie jest dłuższa niż osiem znaków.  Uruchom

DEBUG twojanazwafilmowa

Pojawi się znak zachęty ‘ -’.  Wpisz

DWprowadź

wielokrotnie, aby d wyświetlić plik 128 bajtów na raz.   Type

D address Enter

to display 128 bytes starting at address, which must be typed in hex, where the beginning of the file is address 100.  Type

D address1 address2 Enter

to display from address1 to address2.   Wpisz

D adres Lnum Wpisz

aby wyświetlić num bajtów (długość) zaczynając od adresnum jest również wpisywane w hex.  Użyj Q aby 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
-
```.
6
6
6
2014-02-12 22:39:12 +0000

HxD jest przenośnym edytorem hex, co oznacza, że nie wymaga instalacji i jest niczym więcej niż pojedynczym plikiem exe. http://mh-nexus.de/en/hxd/

Inną podobnie przenośną opcją jest Frhed: http://frhed.sourceforge.net/en/screenshots/

5
5
5
2012-08-31 08:52:04 +0000

Ponieważ Windows 7 posiada wbudowany dotnet framework 3.5, będziesz miał wbudowany kompilator C#, więc możesz pobrać na przykład listing z http://illegalargumentexception.blogspot.co.uk/2008/04/c-file-hex-dump-application.html , a następnie skompilować używając

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

i powinieneś otrzymać printhex.exe, który powinien wyświetlać zarówno znaki hex jak i ascii.

2
2
2
2012-08-30 23:04:31 +0000

Nie jest to idealne rozwiązanie, ale jeśli naprawdę nie chcesz niczego pobierać, możesz spróbować użyć fc /b (tj. porównać pliki w trybie binarnym), aby porównać ten plik z innym, zupełnie innym plikiem, a on pokaże ci wartości heksadecymalne każdego bajtu, który jest inny. Możesz uzyskać pewne wartości, które są takie same w dwóch plikach i mogą zostać pominięte na wyjściu, ale możesz sprawdzić, czy tak się stanie, sprawdzając brakujące wartości w kolumnie offsetu.

2
2
2
2016-06-06 15:42:30 +0000

Możesz użyć poniższej funkcji PowerShell wraz z Get-Content, aby zobaczyć zrzut heksadecymalny zawartości pliku, tj. Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump. Zrzut pliku o rozmiarze 222 KB zajmuje około 23 sekund, a w razie potrzeby wyjście może zostać przekierowane do pliku tekstowego, aby ułatwić analizę 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

Wyjście wygląda 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 ????????????????
1
1
1
2017-05-04 12:26:00 +0000

Ponieważ Sublime text jest moim ulubionym edytorem, używam jego wtyczki do przeglądania plików heksadecymalnych. http://facelessuser.github.io/HexViewer/

0
0
0
2017-08-25 01:07:56 +0000

Wiem, że używasz Emacsa, ale użytkownicy Vim mogą użyć narzędzia xxd:

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

tzn.

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)".
```.