Shell: Bagaimana cara membaca byte dari file biner dan mencetak sebagai heksadesimal?

Jawaban:

45

Menggunakan 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
sumber
6
Lihat juga od. Ada juga hex editor vi-style bernama hexer.
LawrenceC
8
Saya suka output "hexdump -C file" lebih baik. xxd juga merupakan alat yang bagus.
Kambus
tampilkan dalam format bash hexahexdump -e '"\\\x" /1 "%02x"' filename
Aquarius Power
Sebagai informasi, kolom pertama adalah offset heksadesimal dari byte, sisa baris adalah 8 set tampilan dua-byte, yaitu 16 byte, itulah sebabnya mengapa baris kedua dimulai dengan offset 10, yaitu 16 dalam heksadesimal. Representasi dua byte tergantung pada endianness sistem. Ketikkan man hexdumpuntuk detail selengkapnya.
miguelmorin
27

Pilihan lain adalah od :

od -t x1 FILE

atau

od -x FILE

od memiliki banyak opsi untuk finetuning.

Pengguna tidak diketahui
sumber
9
Kebanyakan orang akan menemukan od -t x1format yang saya sukai.
alex
Untuk saluran yang od -t testsaya dapatod: invalid character 't' in type string 'test'
Tom Brito
Ini bekerja dengan--t
Tom Brito
@ Tom: Mungkin rasa Unix / Linux berbeda? Od saya adalah:od --version od (GNU coreutils) 7.4
pengguna tidak diketahui
13

Sementara kita oddan hexdump, dua alat yang lebih mirip:

  • hd (dari bsdmainutils)
  • xxd (bagian dari Vim)

Output sampel:

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

Atau, jika Anda ingin membaca byte satu per satu dan mencetaknya dalam format Anda sendiri, coba sesuatu seperti:

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

Output sampel:

7f
45
4c
46
01
01
01
00
00
00
Mikel
sumber
3
tidak seperti yang lain, xxd juga dapat mengembalikan modifikasi. Dengan itu, dimungkinkan untuk mengubah file biner dengan shell.
Offirmo
2
Anda whilelingkaran tidak bekerja untuk backslash dan karakter baris baru (dan di bash (sebagai lawan ksh93) untuk karakter kosong), dan tidak akan bekerja dengan baik di lokal utf8 untuk byte dengan bit set-8. Juga, Anda tidak perlu "od" di sana, Anda dapat menggunakanprintf '%02x\n' "'$byte"
Stéphane Chazelas
Catatan: offsethanyalah semacam "variabel dummy" di sini; tidak memiliki penggunaan praktis. Itu hanya digunakan sebagai pengganti hex. Inilah yang kadang-kadang memengaruhi keterbacaan dengan cara negatif dengan read: variabel yang muncul tiba-tiba.
syntaxerror
Mungkin. Namun dalam hal ini, ruang lingkup$offset dibatasi oleh subkulit, jadi saya tidak melihatnya sebagai masalah.
Mikel
5

Dua sen saya:

tail -f streamfile | hexdump -C

Saya suka ini karena Anda mengekor file buffering saat ini sambil dapat melihat hexdump langsung. Jangan lupa bahwa SEMUA yang ada di Unix adalah file dan kita dapat dengan mudah membuat perintah seperti taildan hexdumpuntuk menyelesaikan berbagai masalah.

MacGyverQue
sumber
diuji dengan for((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&itu bekerja dengan baik untuk memantau thx :)
Aquarius Power
4
mc 

Komandan tengah malam adalah pilihan lain. Saya tidak tahu apakah itu tersedia untuk semua rasa unix. Anda mungkin perlu mengunduhnya terlebih dahulu.
F3 F4untuk melihat dalam editor internal / dalam mode hex.

Pengguna tidak diketahui
sumber
1

Saya menggunakan od dengan c dan x1, ketika saya perlu mencari teks di dalam file biner:

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