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

Come posso visualizzare il contenuto binario di un file nativamente in Windows 7? (È possibile).

Ho un file, un po’ più grande di 500MB, che sta causando alcuni problemi.

Credo che il problema sia nella convenzione di fine linea (EOL) utilizzata. Vorrei guardare il file nella sua forma grezza non interpretata (1) per confermare la convenzione EOL del file.

Come posso visualizzare il “binario” di un file usando qualcosa di integrato in Windows 7? Preferirei evitare di dover scaricare qualcosa di aggiuntivo.

(1) Io e il mio collega abbiamo aperto il file in editor di testo, e mostrano le linee come ci si aspetterebbe. Ma entrambi gli editor di testo aprono file con convenzioni EOL diverse e le interpretano automaticamente. (TextEdit e Emacs 24.2. Per Emacs ho creato un secondo file con solo i primi 4K byte usando head -c4096 su una macchina linux e l'ho aperto dalla mia macchina windows.

ho tentato di usare la modalità hexl in Emacs, ma quando sono passato alla modalità hexl e poi di nuovo alla modalità testo, il contenuto del buffer era cambiato, aggiungendo un ^M visibile alla fine di ogni riga, quindi non mi fido di questo al momento.

Credo che il problema possa essere nei caratteri di fine riga utilizzati. Gli editor che io e il mio collega abbiamo provato (1) hanno riconosciuto automaticamente la convenzione di fine riga e ci hanno mostrato le linee. E sulla base di altre prove credo che la convenzione EOL sia solo il ritorno a capo. (2) solo ritorno a capo.

Per sapere cosa c'è effettivamente nel file, vorrei guardare il contenuto binario del file, o almeno un paio di migliaia di byte del file, preferibilmente in esadecimale, anche se potrei lavorare con decimali o ottali. Solo gli uno e gli zeri sarebbero abbastanza rozzi da guardare.

** AGGIORNAMENTO**

Tranne quella che suggerisce DEBUG, tutte le risposte qui sotto funzionano in un modo o nell'altro. Ho votato in alto ciascuno di quelli come utile. La mia domanda era mal formata. Nel testare ogni soluzione suggerita ho scoperto che volevo davvero la visualizzazione affiancata di esadecimali e contenuti di testo, e che volevo che fosse qualcosa in cui quando avevo il cursore sopra qualcosa, sia un valore di byte che un carattere di testo, la cosa corrispondente sull'altro lato sarebbe stata evidenziata.

Ho effettivamente risolto il mio problema quando Emacs hexl-mode ha iniziato a funzionare “correttamente”. Così ho finito per non usare nessuna di queste risposte, solo per testarle (dovrei davvero indagare sullo strano comportamento di Emacs e presentare una segnalazione di bug).

Risposte (11)

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

Se avete powershell versione 5.0 o successiva, potete usare la funzione integrata 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

Costruito, veloce e sporco: start powershell, execute:

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

TotalCount è il conteggio dei byte che volete leggere dal file.

Cercate su Google ‘powershell hexdump’ per ottenere versioni molto più raffinate/lavorabili.

Se hai Windows Resource Kit Tools (non esattamente integrato, ma vicino) puoi anche usare un'utilità da linea di comando chiamata list.exe. È un piccolo editor con modalità esagonale. Progettato specificamente per lavorare con grandi file:

List Text File Tool (List) è uno strumento a riga di comando che visualizza e cerca uno o più file di testo. A differenza di altri strumenti di visualizzazione del testo, List non legge l'intero file in memoria quando lo si apre. Permette all'utente di modificare un file di testo in formato esadecimale.

List è utile per la visualizzazione di file di testo o di log in remoto, e per l'uso su server dove gli amministratori sono preoccupati per la degradazione delle prestazioni del sistema.

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

Hai bisogno di un “hex editor”. Ho usato “Hex Editor Neo” per anni ed è molto buono. È disponibile nelle versioni gratuite e a pagamento . (E sono sicuro che ci sono altri strumenti simili disponibili).

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

Questo funziona anche su tutto ciò che è successivo a XP:

certutil -encodehex MyProgram.exe MyProgram.txt

XP richiede il Windows Server 2003 Administration Tools Pack da qui: https://www.microsoft.com/en-us/download/details.aspx?id=16770

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

Copiare il file in un nome con estensione .COM, dove il nome base non sia più lungo di otto caratteri.  Eseguire

DEBUG your_filename

Darà un prompt ‘-’.  Digitare

DInserire

ripetutamente per d visualizzare il file 128 bytes alla volta.   Digita

D address Inserisci

per visualizzare 128 byte a partire da address, che deve essere digitato in hex, dove l'inizio del file è l'indirizzo 100.  Digita

D address1 address2 Inserisci

per visualizzare da address1 a address2.   Digita

D address Lnum Inserisci

per visualizzare num byte (lunghezza) a partire da addressnum è anche inserito in hex.  Usa Q per uscire.

Per esempio,

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 è un editor esadecimale portatile, il che significa che non è necessaria alcuna installazione, e non è altro che un singolo file exe. http://mh-nexus.de/en/hxd/

Un'altra opzione altrettanto portatile è Frhed: http://frhed.sourceforge.net/en/screenshots/

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

Dato che Windows 7 viene fornito con il framework dotnet 3.5 integrato, avrete il compilatore C# integrato, quindi potete prendere, per esempio, l'elenco da http://illegalargumentexception.blogspot.co.uk/2008/04/c-file-hex-dump-application.html e poi compilare usando

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

e dovreste ritrovarvi con un printhex.exe che dovrebbe visualizzare sia caratteri esadecimali che ascii.

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

Non è l'ideale, ma se davvero non vuoi scaricare nulla, allora potresti provare a usare fc /b (cioè file compare in modalità binaria) per confrontare questo file con un altro file completamente diverso, e ti mostrerà i valori esadecimali di ogni byte che è diverso. Potresti ottenere alcuni valori che sono uguali nei due file e quindi potrebbero essere saltati dall'output, ma puoi dire se ciò accade controllando i valori mancanti nella colonna dell'offset.

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

Potete usare la funzione PowerShell qui sotto insieme a Get-Content per vedere un hexdump del contenuto del file, cioè Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump. Ci vogliono circa 23 secondi per fare il dump di un file di 222 KB e, se si desidera, l'output può essere reindirizzato a un file di testo per rendere più facile l'esame del dump.

$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

L'output appare così:

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

Poiché Sublime text è il mio editor preferito, uso il suo plugin per visualizzare i file hex. http://facelessuser.github.io/HexViewer/

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

So che stai usando Emacs ma gli utenti di Vim possono usare l'utilità xxd:

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

cioè

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