Shell:如何读取二进制文件的字节并以十六进制打印?


Answers:


45

采用 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
还检查一下od。还有一个名为的vi风格的十六进制编辑器hexer
LawrenceC

8
我更喜欢“ hexdump -C文件”的输出。xxd也是一个不错的工具。
坎布斯2011年

以bash hexa格式显示hexdump -e '"\\\x" /1 "%02x"' filename
Aquarius Power

信息起见,第一列是字节的十六进制偏移量,其余的行是8组两字节显示,即16个字节,这就是为什么第二行以偏移量(10十六进制为16)开头的原因。两字节的表示形式取决于系统的字节序。键入man hexdump的全部细节。
miguelmorin

26

另一个选择是od

od -t x1 FILE

要么

od -x FILE

od 有许多微调选项。


9
od -t x1我猜大多数人都会找到首选格式。
alex

对于行od -t testod: invalid character 't' in type string 'test'
汤姆·布里托

它与--t
Tom Brito

@Tom:也许是不同的Unix / Linux风格?我的od是:od --version od (GNU coreutils) 7.4
用户未知

12

od和上hexdump,还有另外两个类似的工具:

  • hd(来自bsdmainutils)
  • xxd(Vim的一部分)

样本输出:

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

或者,如果您想一次读取一个字节并以自己的格式打印它们,请尝试以下操作:

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

样本输出:

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

3
与另一个不同,xxd也能够还原修改。这样,可以使用shell更改二进制文件。
Offirmo 2012年

2
您的while循环不适用于反斜杠和换行符(对于空白字符,则不适用于bash(与ksh93相对)),对于设置了第8位的字节,该循环也无法在utf8语言环境中正常工作。此外,您不需要“OD”还有呢,你可以使用printf '%02x\n' "'$byte"
斯特凡Chazelas

注意:offset这里只是一种“虚拟变量”;它没有实际用途。它仅用作到达的占位符hex。有时,这会对read变量的可读性产生负面影响::变量突然出现。
语法错误,2014年

也许。但是在这种情况下,的范围$offset受到子外壳程序的限制,因此我认为这不是问题。
Mikel 2014年

4

我的两分钱:

tail -f streamfile | hexdump -C

我喜欢这样,因为您正在尾随当前正在缓冲的文件,同时能够实时查看hexdump。别忘了Unix中的一切都是文件,我们可以轻松地将类似这样的命令链接起来tailhexdump解决各种各样的问题。


经过测试,for((i=0;i<100;i++));do echo $i >>tst2.bin;sleep 1;done&可以很好地监视thx :)
Aquarius Power

3
mc 

午夜指挥官是另一个选择。我不知道它是否可用于所有Unix风格。您可能需要先下载它。
F3 F4以十六进制模式在内部编辑器中查看。


0

当我需要在二进制文件中搜索文本时,我将od与c和x1一起使用:

$ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.