Você precisa de um "editor hexadecimal". Eu usei "Hex Editor Neo" por anos e é muito bom. Está disponível em versões gratuitas e pagas . (E tenho certeza de que existem outras ferramentas semelhantes disponíveis.)
Eu tenho um arquivo, um pouco maior que 500MB, que está causando alguns problemas.
Acredito que o problema esteja na convenção de final de linha (EOL) usada. Eu gostaria de olhar para o arquivo em sua forma bruta não interpretada (1) para confirmar a convenção EOL do arquivo.
Como posso ver o "binário" de um arquivo usando algo embutido no Windows 7? Eu preferiria evitar ter que baixar qualquer coisa adicional.
(1) Meu colega de trabalho e eu abrimos o arquivo em editores de texto e eles mostram as linhas como seria de se esperar. Mas ambos os editores de texto irão abrir arquivos com diferentes convenções EOL e interpretá-los automaticamente. (TextEdit e Emacs 24.2. Para o Emacs eu havia criado um segundo arquivo com apenas os primeiros bytes de 4K usando head -c4096
em uma caixa linux e abri-lo da minha caixa de janelas.
Eu tentei usar o modo hexl no Emacs, mas quando eu fui para o modo hexl e de volta para o modo de texto, o conteúdo do buffer mudou, adicionando um ^ M visível ao final de cada linha, então eu não estou confiando nisso no momento.
Acredito que o problema esteja no final do caractere de linha usado. Os editores que meu colega de trabalho e eu tentamos (1) reconheceram automaticamente a convenção de fim de linha e nos mostraram linhas. E com base em outras evidências, acredito que a convenção EOL é apenas retorno de carro. (2) retornar apenas.
Para saber o que está realmente no arquivo, eu gostaria de ver o conteúdo binário do arquivo, ou pelo menos alguns milhares de bytes do arquivo, preferivelmente em Hex, embora eu possa trabalhar com decimal ou octal. Apenas uns zeros seria bem difícil de se ver.
UPDATE
Exceto o que sugere DEBUG
, todas as respostas abaixo funcionam de uma forma ou de outra. Eu votei em cima de cada um desses como útil. Minha pergunta foi mal formada. Ao testar cada solução sugerida, descobri que realmente queria ver lado a lado o conteúdo hexadecimal e de texto, e que queria que fosse algo em que, quando eu passava o cursor sobre algo, um valor de byte ou o caractere de texto, a correspondência outro lado seria destacado.
Na verdade, resolvi meu problema quando o modo hexl do Emacs começou a funcionar "corretamente". Então acabei não usando nenhuma dessas respostas, apenas testando-as (Realmente deveria investigar o estranho comportamento do Emacs e arquivar um relatório de erros).
Você precisa de um "editor hexadecimal". Eu usei "Hex Editor Neo" por anos e é muito bom. Está disponível em versões gratuitas e pagas . (E tenho certeza de que existem outras ferramentas semelhantes disponíveis.)
Integrado, rápido e sujo: inicie powershell
, execute:
gc -encoding byte -TotalCount 100 "your_file_path" |% {write-host ("{0:x}" -f $_) -noNewline " "}; write-host
TotalCount é a contagem de bytes que você deseja ler do arquivo.
Google 'powershell hexdump' para obter versões muito mais polidas / viáveis.
Se você tiver o Windows Resource Kit Tools (não exatamente construído, mas próximo), você também pode usar um utilitário de linha cmd chamado list.exe
. É um pequeno editor com o modo hexadecimal. Projetado especificamente para trabalhar com arquivos grandes:
List Text File Tool (List) is a command-line tool that displays and searches one or more text files. Unlike other text display tools, List does not read the whole file into memory when you open it. It allows a user to edit a text file in a hexadecimal format.
List is useful for displaying text or log files remotely, and for use on servers where administrators are concerned with degradation of system performance.
Se você tiver a versão 5.0 ou posterior do powershell, poderá 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.
Copie o arquivo para um nome com uma extensão .COM
, em que o nome base não tenha mais de oito caracteres. Executar
DEBUG
your_filename
Ele fornecerá um prompt ' -
'. Digite
D
Enter
repetidamente para d exibir o arquivo 128 bytes de cada vez. Digite
D
address Enter
para exibir 128 bytes a partir do endereço , que deve ser digitado em hexadecimal, onde o início do arquivo é o endereço 100. Digite
D
address1 address2 Enter
para exibir endereço 1 para endereço 2 . Digite
D
addressL
num Enter
para exibir num bytes (comprimento) começando em endereço . num também é inserido em hexadecimal. 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
-
Como o Windows 7 vem com o framework dotnet 3.5 embutido, você terá o compilador C # embutido, assim você pode pegar, por exemplo, a listagem de link e depois compilar usando
\windows\Microsoft.NET\Framework\v3.5\csc printhex.cs
e você deve acabar com um printhex.exe que deve exibir caracteres hexadecimais e ascii.
Isso também funciona em tudo depois do XP:
certutil -encodehex MyProgram.exe MyProgram.txt
O XP requer o Pacote de Ferramentas Administrativas do Windows Server 2003 aqui:
link
Não é o ideal, mas se você realmente não quiser fazer o download de nada, tente usar fc / b (isto é, comparar arquivo em modo binário) para comparar este arquivo com outro arquivo completamente diferente, e ele mostrará a você os valores hexadecimais de cada byte que é diferente. Você pode obter alguns valores que são os mesmos nos dois arquivos e, portanto, podem ser ignorados da saída, mas você pode saber se isso ocorre verificando os valores ausentes na coluna de deslocamento.
Você pode usar a função PowerShell abaixo junto com Get-Content para ver um hexdump do conteúdo do arquivo, ou seja, Get-Content -Encoding Byte 'MyFile.bin' | Get-HexDump
. São necessários cerca de 23 segundos para despejar um arquivo de 222 KB e, se desejado, a saída pode ser redirecionada para um arquivo de texto para facilitar o exame do dump.
function Get-HexDump
{
[CmdletBinding()]
param
(
[Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
[byte[]] $Bytes,
[Parameter(ValueFromPipeline = $false)]
[string] $Encoding
)
BEGIN
{
if ([string]::IsNullOrEmpty($Encoding) -eq $true)
{
$Encoding = "ascii"
}
if ($Encoding -inotin [System.Text.Encoding]::GetEncodings().Name + "ascii" + "unicode")
{
Throw New-Object ArgumentException("Encoding must be $([System.Text.Encoding]::GetEncodings().Name -join ", "), unicode, or ascii.", '$Encoding')
}
$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)
{
$bufferChars = $displayEncoding.GetChars($buffer);
$bufferText = (($bufferChars | %{ if ([char]::IsControl($_) -eq $true) { "." } else { "$_" } }) -join "")
$hexRow += "$($hexValue) $($bufferText)"
$hexRow
}
else
{
$hexRow += "$($hexValue) "
}
$counter++
}
}
END
{
$counter--
if ($counter % 16 -ne 15)
{
$hexRow += " " * (((16 - $counter % 16) * 3) - 1)
$bufferChars = $displayEncoding.GetChars($buffer);
$bufferText = (($bufferChars | %{ if ([char]::IsControl($_) -eq $true) { "." } else { "$_" } }) -join "")
$hexRow += "$($bufferText)"
$hexRow
}
}
}
A saída é assim:
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 ????????????????
Como o texto Sublime é meu editor favorito, uso seu plug-in para visualizar arquivos hexadecimais. link
Eu sei que você está usando o Emacs, mas os usuários do Vim podem usar o utilitário xxd
:
xxd -s <start_offset> -l <length_offest> <file>
ou seja,
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)".
Tags windows-7