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

Como posso ver o conteúdo binário de um ficheiro nativamente no Windows 7? (Será possível).

Tenho um ficheiro, um pouco maior do que 500MB, que está a causar alguns problemas.

Creio que a questão está no fim da linha (EOL) convenção utilizada. Gostaria de olhar para o ficheiro na sua forma bruta não interpretada (1) para confirmar a convenção da EOL do ficheiro.

Como posso ver o “binário” de um ficheiro utilizando algo incorporado no Windows 7? Prefiro evitar ter de descarregar qualquer coisa adicional.

(1) O meu colega de trabalho e eu abrimos o ficheiro em editores de texto, e eles mostram as linhas como seria de esperar. Mas ambos os editores de texto irão abrir ficheiros com diferentes convenções EOL e interpretá-los automaticamente. (TextEdit e Emacs 24.2. Para o Emacs eu tinha criado um segundo ficheiro com apenas os primeiros 4K bytes usando head -c4096 numa caixa de linux e abri-o a partir da minha caixa de janelas.

Tentei usar o modo hexl-mode no Emacs, mas quando fui ao modo hexl-mode e voltei ao modo texto, o conteúdo do buffer tinha mudado, adicionando um ^M visível ao fim de cada linha, por isso não estou a confiar nisso neste momento.

Creio que a questão pode estar no fim do(s) carácter(es) de fim de linha utilizado(s). Os editores que eu e o meu colega de trabalho tentámos (1) apenas reconhecer automaticamente a convenção de fim de linha e mostraram-nos linhas. E com base noutras provas, acredito que a convenção EOL é apenas o retorno da carruagem. (2) apenas devolução.

Para saber o que está realmente no ficheiro, gostaria de olhar para o conteúdo binário do ficheiro, ou pelo menos alguns milhares de bytes do ficheiro, de preferência em Hex, embora eu pudesse trabalhar com decimal ou octal. Apenas um zeros seria muito difícil de ver.

UPDATE

Excepto a que sugere DEBUG, todas as respostas abaixo funcionam, de uma forma ou de outra. Eu tenho evocado cada uma delas como úteis. A minha pergunta foi mal formulada. Ao testar cada uma das soluções sugeridas, descobri que queria realmente uma visualização lado a lado do hexadecimal e do conteúdo do texto, e que queria que fosse algo em que quando tivesse o meu cursor sobre algo, seja um valor de byte ou o carácter do texto, a coisa correspondente do outro lado fosse realçada.

Na verdade, resolvi o meu problema quando o modo hexl-mode Emacs começou a funcionar “correctamente”. Assim, acabei por não utilizar nenhuma destas respostas, apenas as testando. (Realmente deveria investigar o estranho comportamento do Emacs e arquivar um relatório de erros).

Respostas (11)

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

Se tiver a versão de powershell 5.0 ou posterior, pode usar a função powershell incorporada 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

Construído, rápido e sujo: iniciar powershell, executar:

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

TotalCount é a contagem de bytes que deseja ler do ficheiro.

Google ‘powerhell hexdump’ para obter versões muito mais polidas/trabalháveis.

Se tiver ferramentas do Windows Resource Kit (não exactamente integradas, mas próximas) pode também usar um utilitário de linha cmd chamado list.exe. É um pequeno editor com modo hexadecimal. Concebido especificamente para trabalhar com ficheiros grandes:

Listar Ferramenta de Ficheiro de Texto (List) é uma ferramenta de linha de comando que exibe e pesquisa um ou mais ficheiros de texto. Ao contrário de outras ferramentas de exibição de texto, List não lê todo o ficheiro na memória quando o abre. Permite a um utilizador editar um ficheiro de texto em formato hexadecimal.

& > List é útil para exibir ficheiros de texto ou de registo remotamente, e para utilização em servidores quando os administradores estão preocupados com a degradação do desempenho do sistema.

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

É preciso um “editor hexadecimal”. Há anos que uso o “Hex Editor Neo” e é muito bom. Está disponível em versões gratuitas e pagas . (E tenho a certeza que há outras ferramentas semelhantes disponíveis).

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

Isto também funciona em tudo depois de XP:

certutil -encodehex MyProgram.exe MyProgram.txt

XP requer o pacote de ferramentas de administração do Windows Server 2003 a partir daqui: https://www.microsoft.com/en-us/download/details.aspx?id=16770

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

Copie o ficheiro para um nome com uma extensão .COM, onde o nome base não é mais do que oito caracteres.  Execute

DEBUG seunome_

& Dará um ‘ -’ prompt.  Digite

D

repetidamente para d* é reproduzido o ficheiro 128 bytes de cada vez.   Digite

D endereço Digite

para exibir 128 bytes começando em endereço, que deve ser digitado em hex, onde o início do ficheiro é o endereço 100.  Digite

D endereço1 endereço2 Digite

para exibir de endereço1 a endereço2.   Digite

D endereço Lnum Digite

para exibir num bytes (comprimento) começando em addressnum também é digitado em hex.  Use Q para sair.

Por exemplo,

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 é um editor hex portátil, o que significa que não é necessária instalação, e nada mais é do que um único ficheiro exe. http://mh-nexus.de/en/hxd/

Outra opção igualmente portátil é Frhed: http://frhed.sourceforge.net/en/screenshots/

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

Uma vez que o Windows 7 vem com a estrutura dotnet 3.5 integrada, terá o compilador C# integrado, para que possa obter, por exemplo, a listagem de http://illegalargumentexception.blogspot.co.uk/2008/04/c-file-hex-dump-application.html e depois compilar usando

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

e deverá acabar com um printhex.exe que deverá exibir tanto caracteres hexadecimais como ascii.

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

Não é o ideal, mas se realmente não quiser descarregar nada, então poderia tentar usar fc /b (isto é, comparar ficheiros em modo binário) para comparar este ficheiro com outro completamente diferente, e mostrar-lhe-á os valores hexadecimais de cada byte que é diferente. Poderá obter alguns valores que por acaso são os mesmos nos dois ficheiros e, por isso, poderão ser saltados da saída, mas poderá saber se isso acontece verificando se faltam valores na coluna de compensação.

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

Pode usar a função PowerShell abaixo juntamente com Get-Content para ver um hexdump do conteúdo do ficheiro, ou seja, Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump. Demora cerca de 23 segundos a despejar um ficheiro de 222 KB e, se desejar, a saída pode ser redireccionada para um ficheiro de texto para facilitar o exame do despejo.

$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

A saída tem este 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 ????????????????

0x1&

1
1
1
2017-05-04 12:26:00 +0000

Como o texto Sublime é o meu editor favorito, utilizo o seu plugin para ver ficheiros hexadecimais. http://facelessuser.github.io/HexViewer/

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

Sei que está a usar Emacs mas Vim os utilizadores podem usar xxd utilidade:

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

i.e.

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