Shell: Como ler os bytes de um arquivo binário e imprimir como hexadecimal?

Respostas:

45

Usar hexdump(1)

$ hexdump -x /usr/bin/hexdump 
0000000    feca    beba    0000    0300    0001    0700    0080    0300
0000010    0000    0010    0000    5080    0000    0c00    0000    0700
0000020    0000    0300    0000    00a0    0000    b06f    0000    0c00
0000030    0000    1200    0000    0a00    0100    0010    0000    107c
0000040    0000    0c00    0000    0000    0000    0000    0000    0000
0000050    0000    0000    0000    0000    0000    0000    0000    0000

...

pdo
fonte
6
Também confira od. Há também um editor hexadecimal no estilo vi chamado hexer.
21711 Lawrence-C
8
Eu gosto mais da saída do "arquivo hexdump -C". O xxd também é uma boa ferramenta.
Kambus
show no formato hexa do bashhexdump -e '"\\\x" /1 "%02x"' filename
Aquarius Power
Para obter informações, a primeira coluna é o deslocamento hexadecimal dos bytes, o restante da linha é de 8 conjuntos de displays de dois bytes, ou seja, 16 bytes, razão pela qual a segunda linha começa com um deslocamento de 1016 hexadecimal. A representação de dois bytes depende da continuidade do sistema. Digite man hexdumppara todos os detalhes.
Miguelmorin
26

Outra opção é od :

od -t x1 FILE

ou

od -x FILE

od tem muitas opções para ajuste fino.

Usuário desconhecido
fonte
9
A maioria das pessoas encontraria o od -t x1formato preferido, eu acho.
11747 alex
Para a linha que od -t testeu tenho #od: invalid character 't' in type string 'test'
Tom Brito
Ele trabalhou com--t
Tom Brito
@ Tom: Talvez um sabor diferente de Unix / Linux? Meu od é:od --version od (GNU coreutils) 7.4
usuário desconhecido
12

Enquanto estamos no ode hexdump, mais duas ferramentas semelhantes:

  • hd (de bsdmainutils)
  • xxd (parte do Vim)

Saída de amostra:

$ hd /usr/bin/od | head
00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 03 00 01 00 00 00  20 8e 04 08 34 00 00 00  |........ ...4...|
00000020  a4 a2 00 00 00 00 00 00  34 00 20 00 08 00 28 00  |........4. ...(.|
00000030  1b 00 1a 00 06 00 00 00  34 00 00 00 34 80 04 08  |........4...4...|
00000040  34 80 04 08 00 01 00 00  00 01 00 00 05 00 00 00  |4...............|
00000050  04 00 00 00 03 00 00 00  34 01 00 00 34 81 04 08  |........4...4...|
00000060  34 81 04 08 13 00 00 00  13 00 00 00 04 00 00 00  |4...............|
00000070  01 00 00 00 01 00 00 00  00 00 00 00 00 80 04 08  |................|
00000080  00 80 04 08 c4 9d 00 00  c4 9d 00 00 05 00 00 00  |................|
00000090  00 10 00 00 01 00 00 00  00 a0 00 00 00 20 05 08  |............. ..|

$ xxd /usr/bin/od | head
0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 0300 0100 0000 208e 0408 3400 0000  ........ ...4...
0000020: a4a2 0000 0000 0000 3400 2000 0800 2800  ........4. ...(.
0000030: 1b00 1a00 0600 0000 3400 0000 3480 0408  ........4...4...
0000040: 3480 0408 0001 0000 0001 0000 0500 0000  4...............
0000050: 0400 0000 0300 0000 3401 0000 3481 0408  ........4...4...
0000060: 3481 0408 1300 0000 1300 0000 0400 0000  4...............
0000070: 0100 0000 0100 0000 0000 0000 0080 0408  ................
0000080: 0080 0408 c49d 0000 c49d 0000 0500 0000  ................
0000090: 0010 0000 0100 0000 00a0 0000 0020 0508  ............. ..

Ou, se você quiser ler os bytes um de cada vez e imprimi-los em seu próprio formato, tente algo como:

while read -n 1 byte; do
    ord=$(printf "%b" "${byte:-\000}" |
          od -t x1 |
          { read offset hex; echo $hex; })
    echo "$ord"
done </usr/bin/od

Saída de amostra:

7f
45
4c
46
01
01
01
00
00
00
Mikel
fonte
3
diferente do outro, o xxd também pode reverter a modificação. Com isso, é possível alterar um arquivo binário com shell.
Offirmo
2
Seu whileloop não funciona para caracteres de barra invertida e nova linha (e no bash (ao contrário de ksh93) para caracteres em branco), nem funcionará corretamente em locais utf8 para bytes com o oitavo bit definido. Além disso, você não precisa de "od" lá, pode usarprintf '%02x\n' "'$byte"
Stéphane Chazelas
Nota: offseté apenas uma espécie de "variável dummy" aqui; não tem uso prático. É apenas usado como um espaço reservado para chegar hex. Isso é o que às vezes afeta a legibilidade de maneira negativa com read: variáveis ​​surgindo do nada.
Syntaxerror
Possivelmente. Mas, neste caso, o escopo de $offseté limitado pelo subshell, então não o vejo como um problema.
Mikel
4

Meus dois centavos:

tail -f streamfile | hexdump -C

Eu gosto disso porque você está seguindo um arquivo atualmente em buffer enquanto pode ver o hexdump ao vivo. Não esqueça que TUDO no Unix é um arquivo e podemos facilmente encadear comandos como taile hexdumpresolver uma grande variedade de problemas.

MacGyverQue
fonte
testado com for((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&ele funciona bem para monitoramento thx :)
Aquarius Poder
3
mc 

O comandante da meia-noite é outra opção. Não sei se está disponível para todos os sabores unix. Pode ser necessário fazer o download primeiro.
F3 F4para visualizar no editor interno / no modo hexadecimal.

Usuário desconhecido
fonte
0

Uso od com c e x1, quando preciso procurar texto dentro do arquivo binário:

$ echo "Some text..." | od -t c -t x1
0000000   S   o   m   e       t   e   x   t   .   .   .  \n
         53  6f  6d  65  20  74  65  78  74  2e  2e  2e  0a
0000015
Sergio K
fonte