hexdump e xxd: Inspecionando Dados Binarios em Hexadecimal
O que voce pode fazer com hexdump, xxd e od?
Conclusao: Todas as tres ferramentas exibem os bytes de um arquivo em hexadecimal. Na pratica, use
hexdump -Couxxdprimeiro, usexxd -rquando precisar editar, e mantenhaodcomo alternativa portavel.
- Inspecionar o conteudo de um arquivo byte por byte em hexadecimal
- Revelar caracteres de controle invisiveis, terminadores de linha (CRLF) e bytes BOM
- Usar
xxd -rpara editar um dump hexadecimal e converte-lo de volta em binario
As tres ferramentas em uma linha cada
hexdump -C... a visualizacao classica hex + ASCII (mais comum no Linux)xxd... legivel, e com-rreverte, com-igera um array Cod... o padrao POSIX, mais antigo, sua alternativa quando portabilidade importa
Premissas (ambiente alvo)
- SO: Ubuntu / um Linux tipico
hexdumpeodvem com coreutils / bsdmainutilsxxdfaz parte do pacotevim-common(instalado junto com ovimno Ubuntu)
Por que inspecionar dados binarios em hexadecimal?
Conclusao: Para ver os "bytes invisiveis" que um editor de texto esconde. Diferencas de terminadores de linha, um BOM inicial, espacos em branco extras e codificacoes quebradas so se tornam visiveis em um dump hexadecimal.
"O script nao executa", "o diff nao bate", "a deteccao de arquivo esta errada" -- esses problemas frequentemente escondem um byte que nunca aparece na tela.
- Um terminador de linha do Windows
\r\n(CRLF) entrou no arquivo - Um arquivo UTF-8 carrega um BOM (
EF BB BF) no inicio - Um espaco de largura total ou caractere de controle se infiltrou
Esses sao dificeis de distinguir em um editor de texto, mas um dump hexadecimal mostra cada byte exatamente.
Fundamentos do hexdump -- sempre comece com -C
Conclusao: A saida padrao do
hexdumpinverte bytes em palavras de 16 bits e e dificil de ler. Na pratica, sempre adicione-C(canonico) para alinhar hexadecimal a esquerda e ASCII a direita.
Crie um arquivo de exemplo.
$ printf 'Hello, World!\n' > demo.txt
Com -C, o offset, bytes hexadecimais e ASCII ficam em uma unica linha.
$ hexdump -C demo.txt
00000000 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 0a |Hello, World!.| 0000000e
O 00000000 inicial e o offset desde o inicio do arquivo (em hex), o meio e o valor hexadecimal de cada byte, e o |...| a direita e a visualizacao ASCII (bytes nao imprimiveis aparecem como .).
Sem -C e dificil de ler
$ hexdump demo.txt
0000000 6548 6c6c 2c6f 5720 726f 646c 0a21 000000e
Em um sistema little-endian, isso trata dois bytes como uma palavra e os inverte, entao 48 65 aparece como 6548. E uma fonte comum de confusao -- use -C quando um humano estiver lendo.
Opcoes comuns:
-n <comprimento>: mostrar apenas os primeiros N bytes-s <offset>: pular N bytes desde o inicio-v: mostrar cada linha ao inves de colapsar repeticoes em*
$ hexdump -C -n 16 -s 0 demo.txt
Fundamentos do xxd e seus truques uteis
Conclusao: O
xxdsimples ja imprime um dump legivel. Seu valor real esta em-r(hex de volta para binario),-p(hex puro) e-i(saida como array C) -- a direcao reversa que o hexdump nao consegue fazer.
O xxd simples agrupa hexadecimal em dois bytes por vez com uma visualizacao ASCII a direita.
$ xxd demo.txt
00000000: 4865 6c6c 6f2c 2057 6f72 6c64 210a Hello, World!.
Extrair hex puro (-p)
-p (plain) imprime uma string hexadecimal continua sem separadores -- facil de manipular em scripts.
$ xxd -p demo.txt
48656c6c6f2c20576f726c64210a
Converter hex de volta em binario (-r)
A flag reversa -r e o maior ponto forte do xxd. Edite um dump, depois converta de volta ao binario original.
$ xxd demo.txt | xxd -r Hello, World!
Para reverter a partir de hex puro, adicione -p tambem.
$ echo '48656c6c6f0a' | xxd -r -p Hello
Gerar um array C (-i)
-i (include) imprime o arquivo como um array de bytes C -- util para incorporar firmware ou dados de teste.
$ xxd -i demo.txt
unsigned char demo_txt[] = {
0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64,
0x21, 0x0a
};
unsigned int demo_txt_len = 14;
Opcoes comuns:
-l <comprimento>: mostrar apenas os primeiros N bytes-s <offset>: definir a posicao inicial-c <colunas>: bytes por linha (padrao 16)-g <bytes>: bytes por grupo (padrao 2)
Quando usar od?
Conclusao:
od(octal dump) e o mais portavel -- e o padrao POSIX. Funciona em Linux minimo ou embarcado ondehexdumpouxxdpodem estar ausentes.od -A x -t x1zproduz saida equivalente aohexdump -C.
Como o nome sugere, od era originalmente um dump octal, mas -t define o formato de exibicao e -A define a base do offset.
$ od -A x -t x1z demo.txt
000000 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 0a >Hello, World!.< 00000e
-A x: mostrar offsets em hexadecimal (dpara decimal,opara octal)-t x1: exibir um byte por vez em hexadecimalz: adicionar uma visualizacao ASCII ao final de cada linha
Outros formatos comuns:
od -c: mostrar caracteres e escapes (\n,\t, etc.)od -An -t x1: remover o offset e mostrar apenas bytes hexadecimais
Como a saida do od e especificada pelo POSIX, vale a pena escolher od -A n -t x1 quando a portabilidade de um script importa.
Como escolher entre as tres ferramentas?
Conclusao: Para inspecao do dia a dia use
hexdump -Couxxd; para editar binarios usexxd -r; para scripts portaveis useod. Em caso de duvida,hexdump -Ce suficiente.
| Objetivo | Ferramenta recomendada |
|---|---|
| Apenas ver o conteudo | hexdump -C |
| Legibilidade, visualizacao agrupada | xxd |
| Editar hex e converter de volta | xxd -r |
| Incorporar como array C | xxd -i |
| Portabilidade / ambiente minimo | od -A x -t x1z |
Onde isso importa na pratica
Conclusao: Terminadores de linha perdidos, um BOM e edicoes binarias diretas sao os casos classicos do mundo real. Nenhum pode ser avaliado com seguranca sem um dump hexadecimal.
Encontrar terminadores de linha CRLF perdidos
Quando \r\n (CRLF) se infiltra, voce ve 0d 0a -- um 0d aparece. Uma nova linha Unix \n e apenas 0a.
$ printf 'line1\r\nline2\n' | xxd
00000000: 6c69 6e65 310d 0a6c 696e 6532 0a line1..line2.
O 0d em 310d 0a6c e a prova do CRLF. Voce pode identificar um byte que a coluna ASCII mostra apenas como ..
Verificar a presenca de um BOM UTF-8
Se EF BB BF estiver no inicio de um arquivo, e um BOM UTF-8.
$ hexdump -C bom.txt
00000000 ef bb bf 68 69 0a |...hi.| 00000006
Os tres primeiros bytes ef bb bf sao o BOM. Quando isso prefixa um script shell, #!/bin/bash nao e interpretado corretamente e o script falha ao executar.
Editar binario diretamente (ida e volta)
Faca dump com xxd, edite o hexadecimal em um editor, depois restaure com xxd -r -- isso permite editar um unico byte por vez.
$ xxd demo.txt > demo.hex # edite demo.hex (por exemplo, mude 48 para 4a) $ xxd -r demo.hex > demo_edited.txt
Ao restaurar com xxd -r, mantenha a coluna de offset e a coluna de bytes consistentes. Alterar a contagem de bytes desloca os offsets e pode produzir resultados inesperados. Limite-se a edicoes minimas como substituicoes de um unico byte.
Solucao de Problemas
Conclusao:
xxd: command not foundsignifica quevim-commonnao esta instalado. Se a saida e dificil de ler, verifique se voce esqueceu o-Cnohexdump.
xxd: command not found
xxd vem no pacote vim-common (ou xxd). Em sistemas minimos pode nao estar instalado.
$ sudo apt install xxd
Onde xxd nao estiver disponivel, use od -A x -t x1z ou hexdump -C como alternativa.
A saida do hexdump parece errada
Sem -C, o padrao mostra palavras de 16 bits com bytes invertidos. Se o ASCII nao se alinha e e dificil de ler, suspeite de um -C faltando.
Linhas repetidas colapsam em * em arquivos grandes
hexdump e od colapsam linhas identicas em *. Para ver cada linha, adicione -v.
$ hexdump -C -v largefile.bin | head