Shell: come leggere i byte di un file binario e stamparli come esadecimali?


Risposte:


45

Uso 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

...


6
Guarda anche od. C'è anche un editor esadecimale in stile vi chiamato hexer.
LawrenceC,

8
Mi piace di più l'output di "hexdump -C file". xxd è anche uno strumento piacevole.
Kambus,

mostra in formato bash hexahexdump -e '"\\\x" /1 "%02x"' filename
Aquarius Power il

Per informazione, la prima colonna è l'offset esadecimale dei byte, il resto della riga è 8 set di display a due byte, ovvero 16 byte, motivo per cui la seconda riga inizia con un offset di 10, che è 16 in esadecimale. La rappresentazione a due byte dipende dall'endianità del sistema. Digitare man hexdumpper i dettagli completi.
miguelmorin,

27

Un'altra opzione è od :

od -t x1 FILE

o

od -x FILE

od ha molte opzioni per la messa a punto.


9
La maggior parte delle persone troverebbe od -t x1come formato preferito immagino.
alex

Per la linea che od -t testho ricevutood: invalid character 't' in type string 'test'
Tom Brito,

Ha funzionato con--t
Tom Brito l'

@ Tom: forse un diverso sapore Unix / Linux? Il mio od è:od --version od (GNU coreutils) 7.4
utente sconosciuto

13

Visto che siamo in ode hexdump, due strumenti simili:

  • hd (da bsdmainutils)
  • xxd (parte di Vim)

Uscita campione:

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

Oppure, se vuoi leggere i byte uno alla volta e stamparli nel tuo formato, prova qualcosa del tipo:

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

Uscita campione:

7f
45
4c
46
01
01
01
00
00
00

3
a differenza dell'altro, xxd è anche in grado di ripristinare la modifica. Con ciò, è possibile modificare un file binario con shell.
Offirmo,

2
Il tuo whileloop non funziona per i caratteri backslash e newline (e in bash (al contrario di ksh93) per i caratteri vuoti), né funzionerà correttamente in localizzazioni utf8 per byte con l'ottavo bit impostato. Inoltre, non hai bisogno di "od" lì, puoi usareprintf '%02x\n' "'$byte"
Stéphane Chazelas il

Nota: qui offsetè semplicemente una sorta di "variabile fittizia"; non ha alcun uso pratico. Viene usato solo come segnaposto per arrivare hex. Questo è ciò che a volte influenza la leggibilità in modo negativo con read: variabili che escono dal nulla.
syntaxerror,

Forse. Ma in questo caso, l'ambito di $offsetè limitato dalla subshell, quindi non lo vedo come un problema.
Mikel,

5

I miei due centesimi:

tail -f streamfile | hexdump -C

Mi piace questo perché stai adattando un file attualmente in buffering mentre sei in grado di vedere il hexdump dal vivo. Non dimenticare che TUTTO in Unix è un file e possiamo facilmente concatenare comandi come taile hexdumpper risolvere un'ampia varietà di problemi.


testato con for((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&esso funziona bene per il monitoraggio grazie :)
Aquarius Power

4
mc 

Il comandante di mezzanotte è un'altra opzione. Non so se sia disponibile per tutti i gusti unix. Potrebbe essere necessario scaricarlo prima.
F3 F4per visualizzare in editor interno / in modalità esadecimale.


1

Uso od con c e x1, quando devo cercare del testo all'interno del file 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.