hexdump e xxd: Inspecionando Dados Binarios em Hexadecimal

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 -C ou xxd primeiro, use xxd -r quando precisar editar, e mantenha od como 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 -r para 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 -r reverte, com -i gera um array C
  • od ... o padrao POSIX, mais antigo, sua alternativa quando portabilidade importa

Premissas (ambiente alvo)

  • SO: Ubuntu / um Linux tipico
  • hexdump e od vem com coreutils / bsdmainutils
  • xxd faz parte do pacote vim-common (instalado junto com o vim no 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 hexdump inverte 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 xxd simples 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 onde hexdump ou xxd podem estar ausentes. od -A x -t x1z produz saida equivalente ao hexdump -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 (d para decimal, o para octal)
  • -t x1: exibir um byte por vez em hexadecimal
  • z: 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 -C ou xxd; para editar binarios use xxd -r; para scripts portaveis use od. Em caso de duvida, hexdump -C e 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 found significa que vim-common nao esta instalado. Se a saida e dificil de ler, verifique se voce esqueceu o -C no hexdump.

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

Proximas Leituras