Shell: ¿Cómo leer los bytes de un archivo binario e imprimir como hexadecimal?

Respuestas:

45

Utilizar 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
fuente
66
También echa un vistazo od. También hay un editor hexadecimal de estilo vi llamado hexer.
LawrenceC
8
Me gusta más la salida del "archivo hexdump -C". xxd también es una buena herramienta.
Kambus
show en formato bash hexahexdump -e '"\\\x" /1 "%02x"' filename
Acuario Power
Para información, la primera columna es el desplazamiento hexadecimal de los bytes, el resto de la línea son 8 conjuntos de pantallas de dos bytes, es decir, 16 bytes, por lo que la segunda línea comienza con un desplazamiento de 10, que es 16 en hexadecimal. La representación de dos bytes depende de la endianidad del sistema. Escriba man hexdumppara los detalles completos.
miguelmorin
27

Otra opción es od :

od -t x1 FILE

o

od -x FILE

od tiene muchas opciones para un ajuste fino.

usuario desconocido
fuente
9
La mayoría de la gente encontraría od -t x1como formato preferido, supongo.
alex
Para la línea od -t testque obtuveod: invalid character 't' in type string 'test'
Tom Brito
Funcionó con--t
Tom Brito
@Tom: ¿Quizás un sabor diferente de Unix / Linux? Mi od es:od --version od (GNU coreutils) 7.4
usuario desconocido
13

Mientras estamos en ody hexdump, dos herramientas más similares:

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

Salida de muestra:

$ 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  ............. ..

O, si desea leer los bytes de uno en uno e imprimirlos en su propio formato, intente 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

Salida de muestra:

7f
45
4c
46
01
01
01
00
00
00
Mikel
fuente
3
a diferencia del otro, xxd también puede revertir la modificación. Con eso, es posible alterar un archivo binario con shell.
Offirmo
2
Su whilebucle no funciona para la barra diagonal inversa y los caracteres de nueva línea (y en bash (a diferencia de ksh93) para los caracteres en blanco), ni funcionará correctamente en utf8 locales para bytes con el octavo bit establecido. Además, no necesita "od" allí, puede usarprintf '%02x\n' "'$byte"
Stéphane Chazelas
Nota: aquí offsetes simplemente una especie de "variable ficticia"; No tiene uso práctico. Solo se usa como marcador de posición para llegar hex. Esto es lo que a veces afecta la legibilidad de manera negativa con read: variables que salen de la nada.
syntaxerror
Quizás. Pero en este caso, el alcance de $offsetestá limitado por la subshell, por lo que no lo veo como un problema.
Mikel
5

Mis dos centavos:

tail -f streamfile | hexdump -C

Me gusta esto porque estás siguiendo un archivo de almacenamiento en búfer actual mientras puedes ver el hexdump en vivo. No olvide que TODO en Unix es un archivo y podemos encadenar fácilmente comandos como taily hexdumppara resolver una amplia variedad de problemas.

MacGyverQue
fuente
probado con for((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&él funciona bien para monitorear thx :)
Aquarius Power
4
mc 

El comandante de medianoche es otra opción. No sé si está disponible para todos los sabores de Unix. Es posible que deba descargarlo primero.
F3 F4para ver en editor interno / en modo hexadecimal.

usuario desconocido
fuente
1

Uso od con c y x1, cuando necesito buscar texto dentro del archivo binario:

$ 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
fuente