hexdump e xxd: Inspecionando Dados Binários em Hexadecimal

hexdump e xxd: Inspecionando Dados Binários em Hexadecimal

O que você pode fazer com hexdump, xxd e od?

Conclusão: Todas as três ferramentas exibem os bytes de um arquivo em hexadecimal. Na prática, use hexdump -C ou xxd primeiro, use xxd -r quando precisar editar, e mantenha od como alternativa portável.

  • Inspecionar o conteúdo de um arquivo byte por byte em hexadecimal
  • Revelar caracteres de controle invisíveis, terminadores de linha (CRLF) e bytes BOM
  • Usar xxd -r para editar um dump hexadecimal e convertê-lo de volta em binário

As três ferramentas em uma linha cada

  • hexdump -C ... a visualização clássica hex + ASCII (mais comum no Linux)
  • xxd ... legível, e com -r reverte, com -i gera um array C
  • od ... o padrão POSIX, mais antigo, sua alternativa quando portabilidade importa

Premissas (ambiente alvo)

  • SO: Ubuntu / um Linux típico
  • hexdump e od vêm com coreutils / bsdmainutils
  • xxd faz parte do pacote vim-common (instalado junto com o vim no Ubuntu)

Por que inspecionar dados binários em hexadecimal?

Conclusão: Para ver os "bytes invisíveis" que um editor de texto esconde. Diferenças de terminadores de linha, um BOM inicial, espaços em branco extras e codificações quebradas só se tornam visíveis em um dump hexadecimal.

"O script não executa", "o diff não bate", "a detecção de arquivo está 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 início
  • Um espaço de largura total ou caractere de controle se infiltrou

Esses são difíceis de distinguir em um editor de texto, mas um dump hexadecimal mostra cada byte exatamente.

Fundamentos do hexdump -- sempre comece com -C

Conclusão: A saída padrão do hexdump inverte bytes em palavras de 16 bits e é difícil de ler. Na prática, sempre adicione -C (canônico) para alinhar hexadecimal à esquerda e ASCII à direita.

Crie um arquivo de exemplo.

$ printf 'Hello, World!\n' > demo.txt

Com -C, o offset, bytes hexadecimais e ASCII ficam em uma única 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 é o offset desde o início do arquivo (em hex), o meio é o valor hexadecimal de cada byte, e o |...| à direita é a visualização ASCII (bytes não imprimíveis aparecem como .).

Sem -C é difícil 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, então 48 65 aparece como 6548. É uma fonte comum de confusão -- use -C quando um humano estiver lendo.

Opções comuns:

  • -n <comprimento>: mostrar apenas os primeiros N bytes
  • -s <offset>: pular N bytes desde o início
  • -v: mostrar cada linha ao invés de colapsar repetições em *
$ hexdump -C -n 16 -s 0 demo.txt

Fundamentos do xxd e seus truques úteis

Conclusão: O xxd simples já imprime um dump legível. Seu valor real está em -r (hex de volta para binário), -p (hex puro) e -i (saída como array C) -- a direção reversa que o hexdump não consegue fazer.

O xxd simples agrupa hexadecimal em dois bytes por vez com uma visualização ASCII à 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 -- fácil de manipular em scripts.

$ xxd -p demo.txt
48656c6c6f2c20576f726c64210a

Converter hex de volta em binário (-r)

A flag reversa -r é o maior ponto forte do xxd. Edite um dump, depois converta de volta ao binário original.

$ xxd demo.txt | xxd -r
Hello, World!

Para reverter a partir de hex puro, adicione -p também.

$ echo '48656c6c6f0a' | xxd -r -p
Hello

Gerar um array C (-i)

-i (include) imprime o arquivo como um array de bytes C -- útil 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;

Opções comuns:

  • -l <comprimento>: mostrar apenas os primeiros N bytes
  • -s <offset>: definir a posição inicial
  • -c <colunas>: bytes por linha (padrão 16)
  • -g <bytes>: bytes por grupo (padrão 2)

Quando usar od?

Conclusão: od (octal dump) é o mais portável -- é o padrão POSIX. Funciona em Linux mínimo ou embarcado onde hexdump ou xxd podem estar ausentes. od -A x -t x1z produz saída equivalente ao hexdump -C.

Como o nome sugere, od era originalmente um dump octal, mas -t define o formato de exibição 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 (d para decimal, o para octal)
  • -t x1: exibir um byte por vez em hexadecimal
  • z: adicionar uma visualização 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 saída do od é especificada pelo POSIX, vale a pena escolher od -A n -t x1 quando a portabilidade de um script importa.

Como escolher entre as três ferramentas?

Conclusão: Para inspeção do dia a dia use hexdump -C ou xxd; para editar binários use xxd -r; para scripts portáveis use od. Em caso de dúvida, hexdump -C é suficiente.

Objetivo Ferramenta recomendada
Apenas ver o conteúdo hexdump -C
Legibilidade, visualização agrupada xxd
Editar hex e converter de volta xxd -r
Incorporar como array C xxd -i
Portabilidade / ambiente mínimo od -A x -t x1z

Onde isso importa na prática

Conclusão: Terminadores de linha perdidos, um BOM e edições binárias diretas são os casos clássicos do mundo real. Nenhum pode ser avaliado com segurança sem um dump hexadecimal.

Encontrar terminadores de linha CRLF perdidos

Quando \r\n (CRLF) se infiltra, você vê 0d 0a -- um 0d aparece. Uma nova linha Unix \n é apenas 0a.

$ printf 'line1\r\nline2\n' | xxd
00000000: 6c69 6e65 310d 0a6c 696e 6532 0a          line1..line2.

O 0d em 310d 0a6c é a prova do CRLF. Você 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 início de um arquivo, é um BOM UTF-8.

$ hexdump -C bom.txt
00000000  ef bb bf 68 69 0a                                 |...hi.|
00000006

Os três primeiros bytes ef bb bf são o BOM. Quando isso prefixa um script shell, #!/bin/bash não é interpretado corretamente e o script falha ao executar.

Editar binário diretamente (ida e volta)

Faça dump com xxd, edite o hexadecimal em um editor, depois restaure com xxd -r -- isso permite editar um único 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 edições mínimas como substituições de um único byte.

Solução de Problemas

Conclusão: xxd: command not found significa que vim-common não está instalado. Se a saída é difícil de ler, verifique se você esqueceu o -C no hexdump.

xxd: command not found

xxd vem no pacote vim-common (ou xxd). Em sistemas mínimos pode não estar instalado.

$ sudo apt install xxd

Onde xxd não estiver disponível, use od -A x -t x1z ou hexdump -C como alternativa.

A saída do hexdump parece errada

Sem -C, o padrão mostra palavras de 16 bits com bytes invertidos. Se o ASCII não se alinha e é difícil de ler, suspeite de um -C faltando.

Linhas repetidas colapsam em * em arquivos grandes

hexdump e od colapsam linhas idênticas em *. Para ver cada linha, adicione -v.

$ hexdump -C -v largefile.bin | head

Próximas Leituras