Shell: Làm thế nào để đọc các byte của tệp nhị phân và in dưới dạng thập lục phân?


Câu trả lời:


45

Sử dụng 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
Ngoài ra kiểm tra od. Ngoài ra còn có một trình soạn thảo hex kiểu vi được gọi là hexer.
LawrenceC

8
Tôi thích đầu ra của "hexdump -C file" hơn. xxd cũng là một công cụ tốt
Kambus

hiển thị ở định dạng bash hexahexdump -e '"\\\x" /1 "%02x"' filename
Sức mạnh của Bảo Bình

Để biết thông tin, cột đầu tiên là phần bù thập lục phân của các byte, phần còn lại của dòng là 8 bộ hiển thị hai byte, tức là 16 byte, đó là lý do tại sao dòng thứ hai bắt đầu với phần bù 10là 16 ở dạng thập lục phân. Các đại diện hai byte phụ thuộc vào endianness của hệ thống. Nhập man hexdumpđể biết chi tiết đầy đủ.
Miguelmorin

26

Một lựa chọn khác là od :

od -t x1 FILE

hoặc là

od -x FILE

od có nhiều lựa chọn để hoàn thiện.


9
od -t x1Tôi đoán hầu hết mọi người sẽ tìm thấy định dạng ưa thích.
alex

Đối với dòng od -t testtôi đã nhậnod: invalid character 't' in type string 'test'
Tom Brito

Nó hoạt động với--t
Tom Brito

@Tom: Có thể là một hương vị Unix / Linux khác nhau? Mùi của tôi là:od --version od (GNU coreutils) 7.4
người dùng không biết

12

Trong khi chúng tôi đang trên odhexdump, hai công cụ tương tự khác:

  • hd (từ bsdmainutils)
  • xxd (một phần của Vim)

Đầu ra mẫu:

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

Hoặc, nếu bạn muốn đọc từng byte một và in chúng theo định dạng của riêng bạn, hãy thử một cái gì đó như:

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

Đầu ra mẫu:

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

3
Không giống như cái khác, xxd cũng có thể hoàn nguyên sửa đổi. Cùng với đó, có thể thay đổi tệp nhị phân bằng shell.
Offirmo

2
whileVòng lặp của bạn không hoạt động cho dấu gạch chéo ngược và ký tự dòng mới (và trong bash (trái ngược với ksh93) cho các ký tự trống), cũng không hoạt động chính xác trong các ngôn ngữ utf8 cho các byte với tập bit 8. Ngoài ra, bạn không cần "od" ở đó, bạn có thể sử dụngprintf '%02x\n' "'$byte"
Stéphane Chazelas

Lưu ý: offsetchỉ đơn thuần là một loại "biến giả" ở đây; nó không có công dụng thực tế Nó chỉ được sử dụng như một giữ chỗ để có được hex. Đây là những gì đôi khi ảnh hưởng đến khả năng đọc theo cách tiêu cực với read: các biến ra khỏi màu xanh.
cú pháp

Có lẽ. Nhưng trong trường hợp này, phạm vi $offsetbị giới hạn bởi lớp con, vì vậy tôi không xem đó là một vấn đề.
Mikel

4

Hai xu của tôi:

tail -f streamfile | hexdump -C

Tôi thích điều này bởi vì bạn đang theo dõi một tập tin đệm hiện tại trong khi có thể xem hexdump trực tiếp. Đừng quên rằng MỌI THỨ trong Unix là một tệp và chúng ta có thể dễ dàng xâu chuỗi các lệnh như tailhexdumpđể giải quyết nhiều vấn đề khác nhau.


đã thử nghiệm với for((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&nó hoạt động tốt để theo dõi thx :)
Sức mạnh của Bảo Bình vào

3
mc 

Chỉ huy nửa đêm là một lựa chọn khác. Tôi không biết liệu nó có sẵn cho tất cả các hương vị unix. Bạn có thể cần phải tải xuống đầu tiên.
F3 F4để xem trong trình chỉnh sửa nội bộ / trong chế độ hex.


0

Tôi sử dụng od với c và x1, khi tôi cần tìm kiếm văn bản bên trong tệp nhị phân:

$ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.