¿Cómo puedo ver el contenido binario de un archivo de forma nativa en Windows 7? (Es posible.)

35

Tengo un archivo, un poco más grande que 500MB, que está causando algunos problemas.

Creo que el problema está en la convención de fin de línea (EOL) utilizada. Me gustaría ver el archivo en su forma cruda no interpretada (1) para confirmar la convención EOL del archivo.

¿Cómo puedo ver el "binario" de un archivo usando algo integrado en Windows 7? Preferiría evitar tener que descargar nada adicional.

(1) Mi compañero de trabajo y yo abrimos el archivo en editores de texto y muestran las líneas como cabría esperar. Pero ambos editores de texto abrirán archivos con diferentes convenciones de EOL y los interpretarán automáticamente. (TextEdit y Emacs 24.2. Para Emacs, creé un segundo archivo con solo los primeros 4 Kbytes head -c4096en un cuadro de Linux y lo abrí desde mi cuadro de Windows.

Intenté usar el modo hexl en Emacs, pero cuando fui al modo hexl y volví al modo texto, el contenido del búfer había cambiado, agregando un ^ M visible al final de cada línea, así que no estoy confiando en eso en este momento.

Creo que el problema puede estar en los caracteres de final de línea utilizados. Los editores que mi compañero de trabajo y yo probamos (1) reconocieron automáticamente la convención de fin de línea y nos mostraron líneas. Y basado en otra evidencia, creo que la convención EOL es solo retorno de carro. (2) solo devolución.

Para saber qué hay realmente en el archivo, me gustaría ver el contenido binario del archivo, o al menos un par de miles de bytes del archivo, preferiblemente en hexadecimal, aunque podría trabajar con decimal u octal. Solo unos y ceros serían bastante difíciles de ver.

ACTUALIZAR

Excepto el que sugiere DEBUG, todas las respuestas a continuación funcionan en cierta medida u otra. He votado a favor de cada uno de ellos como útiles. Mi pregunta estaba mal formada. Al probar cada solución sugerida, descubrí que realmente quería ver de lado a lado el contenido hexadecimal y de texto, y que quería que fuera algo donde cuando tenía el cursor sobre algo, ya sea un valor de byte o el carácter de texto, la coincidencia en el otro lado se destacaría.

De hecho, resolví mi problema cuando Emacs hexl-mode comenzó a funcionar "correctamente". Así que terminé sin usar ninguna de estas respuestas, solo probándolas (realmente debería investigar el extraño comportamiento de Emacs y presentar un informe de error).

Shannon Cesantía
fuente
Probablemente hay algún tipo de herramienta bajo Cygwin, pero eso requeriría instalar Cygwin. O si tiene, por ejemplo, Java instalado en su caja, sería una tarea bastante simple escribir un programa de volcado hexadecimal en Java.
Daniel R Hicks

Respuestas:

11

Necesita un "editor hexadecimal". He usado "Hex Editor Neo" durante años y es muy bueno. Está disponible en versiones gratuitas y de pago . (Y estoy seguro de que hay otras herramientas similares disponibles).

Daniel R Hicks
fuente
44
Le pregunté cómo, sin nada más que Windows 7 porque no me gusta agregar programas adicionales porque 1) Muchos se instalan de una manera que los derechos que tengo no me permiten. 2) Algunos parecen ser poco fiables. Dicho esto, el editor de Hex Neo parece ser una buena recomendación. +1
Shannon Severance
1
zblist.com es un programa independiente que no necesita ser instalado o necesita ningún derecho especial y tiene un modo Alt-H o hexadecimal
sgmoore
Cumplí con todos mis requisitos, incluidos los declarados, incorrectos, no establecidos. Hex Editor Neo también fue rápido, y se ha agregado a mi bolsa de herramientas.
Shannon Severance
1. Otros editores no son nativos. 2. Los administradores de archivos son buenos para este propósito y hay muchos que son portátiles. 3. El comando Tipo puede mostrar el contenido de forma nativa y tiene filtros útiles (como página por página).
Overmind
37

Si tiene powershell versión 5.0 o posterior, puede usar la powershellfunción incorporadaFormat-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.
AzizSM
fuente
44
Estoy francamente sorprendido de que esta no sea la mejor respuesta. Esta es LA forma correcta de hacerlo usando una herramienta integrada en Windows. Si desea escribir la salida en un archivo, puede usar> Format-Hex application.exe> ​​out.txt
techdude
Esto parece agradable, pero Format-Hexno está disponible en mi PowerShell; Acabo de recibir un error "no reconocido"
Kidburla
Según JamieSee, aparentemente no se agregó hasta powershell 5.0.
techdude
26

Construido, rápido y sucio: iniciar powershell, ejecutar:

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

TotalCount es el recuento de bytes que desea leer del archivo.

Google 'powershell hexdump' para obtener versiones mucho más pulidas / viables.

Si tiene las herramientas del Kit de recursos de Windows (no exactamente integradas, pero cercanas) también puede usar una utilidad de línea cmd llamada list.exe. Es un pequeño editor con modo hexadecimal. Diseñado específicamente para trabajar con archivos grandes:

La herramienta Listar archivo de texto (Lista) es una herramienta de línea de comandos que muestra y busca uno o más archivos de texto. A diferencia de otras herramientas de visualización de texto, List no lee todo el archivo en la memoria cuando lo abre. Permite al usuario editar un archivo de texto en formato hexadecimal.

La lista es útil para mostrar archivos de texto o de registro de forma remota, y para usar en servidores donde los administradores están preocupados por la degradación del rendimiento del sistema.

wmz
fuente
1
Hasta ahora, esta solución es la más cercana que estaba pidiendo.
Shannon Severance
1
Agradable, simple, ya instalado. Cambié el formato a host de escritura ("{0: X2}" para obligar a 0x0A a aparecer como "0A" no "A", el 2 por 2 dígitos en mayúscula porque así es como me gusta
Adam Straughan
1
List.exe fue perfecto: el list.exe /?comando de ayuda no proporciona mucha información, pero una vez dentro del editor, simplemente presiona ?para ver los comandos. Habre el editor Hex, y F1alterna la forma en que se muestra el Hex
Coruscate5
7

Esto también funciona en todo después de XP:

certutil -encodehex MyProgram.exe MyProgram.txt

XP requiere el paquete de herramientas de administración de Windows Server 2003 desde aquí:

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

moscas
fuente
más solución portátil y de vuelta compatible en las ventanas, se podría utilizar incluso de secuencias de comandos por lotes ventanas, sorprendido por qué es esto todavía no se encuentra en la parte superior de todas las respuestas
Andry
6

Copie el archivo a un nombre con una .COMextensión, donde el nombre base no tenga más de ocho caracteres. correr

DEBUG su_nombre de archivo

Dará un ' -' aviso. Tipo

DEnter

repetidamente a d isplay el archivo de 128 bytes a la vez. Tipo

D dirección Enter

para mostrar 128 bytes comenzando en la dirección , que debe escribirse en hexadecimal, donde el comienzo del archivo es la dirección 100. Escriba

D dirección 1 dirección 2 Enter

para mostrar desde la dirección 1 a la dirección 2 . Tipo

D dirección Lnum Enter

para mostrar num bytes (longitud) comenzando en la direcciónnum también se ingresa en hexadecimal. Use Qpara dejar de fumar.

Por ejemplo,

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
-
Scott
fuente
3
Desafortunadamente, eso no funcionará si el archivo es más grande que aproximadamente 64 KB, el máximo para un .COM. (Tiene que encajar en el segmento que comienza en el desplazamiento 100 h.)
Ken
1
C:\>attrib debug.exe /s. Resultados: File not found - debug.exe. No se pudo encontrar la declaración oficial, la depuración ya no es compatible , pero por lo que vi en la web parece que el soporte de depuración se ha eliminado hace un tiempo. Encontré DebugDiag de Microsoft. (Descarga adicional). ¿Depuración? Tal vez es compatible con la búsqueda de archivos en HEX? Entregado como un archivo .MSI. Necesita una contraseña de administrador para instalar. No soy uno
Shannon Severance
@ Ken ya lo había usado head -c4096 bigFileName > smallFileNameen Linux para obtener los primeros 4 KB de los archivos. Las líneas son lo suficientemente pequeñas como para que cuatro KB tengan muchas líneas para mis propósitos
Shannon Severance
Entonces, ¿por qué no usar hexdump -Cmientras está en Linux?
Ken
3
La depuración de @Shannon es parte de DOS y, como tal, si está utilizando x64, no está allí.
kinokijuf
5

Dado que Windows 7 viene con el framework dotnet 3.5 integrado, tendrá el compilador C # incorporado, por lo que puede obtener, por ejemplo, la lista de http://illegalargumentexception.blogspot.co.uk/2008/04/c- file-hex-dump-application.html y luego compilar usando

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

y debería terminar con un printhex.exe que debería mostrar caracteres hexadecimales y ascii.

sgmoore
fuente
Simple y sin necesidad de descarga gigantesca.
live-love
2

No es lo ideal, pero si realmente no desea descargar nada, entonces puede intentar usar fc / b (es decir, comparar archivos en modo binario) para comparar este archivo con otro archivo completamente diferente, y le mostrará el hexadecimal valores de cada byte que es diferente. Es posible que obtenga algunos valores que resultan ser los mismos en los dos archivos y, por lo tanto, puede omitirse de la salida, pero puede saber si eso sucede al verificar los valores faltantes en la columna de desplazamiento.

sgmoore
fuente
No es ideal, pero pude hacerlo creando un archivo de 0x00 bytes y luego compararlo con eso. Siendo un archivo de texto que estaba viendo, y que estaba interesado en 0a y 0d, principalmente un archivo de nulos como comparación funcionó. Pero no proporciona tanto la vista de personaje como la vista hexadecimal lado a lado, lo que hace que sea más difícil encontrar dónde quería mirar. (Como lo hace la depuración en la respuesta de Scott y como lo hace el modo hexl de Emacs. No había pedido una vista de lado a lado, pero es bastante crucial para la forma en que realmente uso los volcados hexadecimales.)
Shannon Severance
2

Puede utilizar la función de PowerShell a continuación junto con Get-Content para ver un volcado hexadecimal del contenido del archivo, es decir, Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump. Se tarda unos 23 segundos en volcar un archivo de 222 KB y, si lo desea, la salida se puede redirigir a un archivo de texto para facilitar el examen del volcado.

$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

La salida se ve así:

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   ????????????????
JamieVer
fuente
O simplemente use el nombre de archivo Format-Hex
techdude
@techdude Format-Hex no está disponible en todas las versiones de PowerShell. No existe en PowerShell 4 y versiones anteriores. Escribí este código antes de que Format-Hex existiera.
JamieVer
¿Cómo revertir esto al archivo binario?
Zimba
0

Sé que estás usando Emacs pero los usuarios de Vim pueden usar la xxdutilidad:

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

es decir

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