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

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

Tengo un archivo, un poco más grande de 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 utilizando algo incorporado en Windows 7? Preferiría no 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 uno esperaría. Pero ambos editores de texto abren archivos con diferentes convenciones de EOL y los interpretan automáticamente. (TextEdit y Emacs 24.2. Para Emacs había creado un segundo archivo con sólo los primeros 4K bytes usando head -c4096 en una caja linux y lo abrí desde mi caja windows.

Intenté usar el modo hexl en Emacs, pero cuando pasé al modo hexl y volví al modo texto, el contenido del buffer había cambiado, añadiendo una ^M visible al final de cada línea, así que no me fío por el momento.

Creo que el problema puede estar en el carácter o caracteres de fin de línea utilizados. Los editores que mi compañero de trabajo y yo probamos (1) reconocían automáticamente la convención de fin de línea y nos mostraban las líneas. Y basándome en otras pruebas creo que la convención de fin de línea es sólo retorno de carro. (2) sólo retorno.

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 Hex, aunque podría trabajar con decimal u octal. Sólo los unos y los ceros sería bastante duro de ver.

Actualización

Excepto la que sugiere DEBUG, todas las respuestas de abajo funcionan en cierta medida. He votado cada una de ellas como útil. Mi pregunta estaba mal formulada. Al probar cada una de las soluciones sugeridas, me di cuenta de que realmente quería ver el contenido hexadecimal y el de texto, y que quería que cuando tuviera el cursor sobre algo, ya sea un valor de byte o un carácter de texto, se resaltara lo que coincidiera en el otro lado.

En realidad resolví mi problema cuando el modo hexl de Emacs empezó a funcionar “correctamente”. Así que terminé por no usar ninguna de estas respuestas, sólo probarlas. (Realmente debería investigar el extraño comportamiento de Emacs y presentar un informe de error).

Respuestas (11)

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

Si tiene la versión 5.0 o posterior de powershell, puede utilizar la función integrada powershell

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

Incorporado, 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 la cuenta de bytes que quieres leer del archivo.

Busca en Google ‘powershell hexdump’ para obtener versiones mucho más pulidas/viables.

Si tienes el Windows Resource Kit Tools (no exactamente incorporado, pero casi) también puedes 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:

List Herramienta de archivos de texto (List) es una herramienta de línea de comandos que muestra y busca en 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 al abrirlo. Permite al usuario editar un archivo de texto en formato hexadecimal.

List es útil para visualizar archivos de texto o de registro de forma remota, y para su uso en servidores donde los administradores están preocupados por la degradación del rendimiento del sistema.

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

Necesitas un “editor hexadecimal”. He utilizado “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).

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

Esto también funciona en todo lo posterior a 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

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

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

DEBUG sunombredearchivo_

Dará un aviso de ‘ -’.  Escriba

DIntroduzca

repetidamente para d isplay el archivo 128 bytes a la vez.   Escriba

D dirección Introduzca

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

D dirección1 dirección2 Introduzca

para mostrar desde dirección1 hasta dirección2.   Escriba

D dirección Lnum Introduzca

para mostrar num bytes (longitud) empezando por direcciónnum también se introduce en hexadecimal.  Utilice Q para salir.

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
-
6
6
6
2014-02-12 22:39:12 +0000

HxD es un editor hexadecimal portátil, lo que significa que no necesita instalación, y no es más que un único archivo exe. http://mh-nexus.de/en/hxd/

Otra opción igualmente portable es Frhed: http://frhed.sourceforge.net/en/screenshots/

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

Como Windows 7 viene con el dotnet framework 3.5 incorporado, tendrás el compilador de C# incorporado, así que puedes coger, por ejemplo, el listado 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ías terminar con un printhex.exe que debería mostrar tanto caracteres hexadecimales como ascii.

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

No es lo ideal, pero si realmente no quieres descargar nada, entonces puedes intentar usar fc /b (es decir, comparar archivos en modo binario) para comparar este archivo con otro completamente diferente, y te mostrará los valores hexadecimales de cada byte que sea diferente. Es posible que obtenga algunos valores que son iguales en los dos archivos y por lo tanto pueden ser omitidos de la salida, pero se puede saber si esto sucede mediante la comprobación de los valores que faltan en la columna de desplazamiento.

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

Puede utilizar la función PowerShell que aparece 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. Tarda unos 23 segundos en volcar un archivo de 222 KB y, si se desea, la salida puede redirigirse 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 tiene el siguiente aspecto

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

Como Sublime text es mi editor favorito, uso su plugin para ver los archivos hexadecimales. http://facelessuser.github.io/HexViewer/

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

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

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