一、简介
在计算机科学中,一个 0 或 1 存储的数据称为一个位(bit,代表 binary digit,即二进制数);连续 8 位称为一个字节。
od
和 hexdump
可以以可读的格式显示任何类型的二进制数据。实际上,这两个文件是两个基于文本的查看二进制文件内部的主要工具。
大多数有经验的 Unix 人士倾向于选择一个自己喜欢的程序使用,要么是 od ,要么是 hexdump
二、规范输出
某种特定格式的二进制文件输出格式称为规范输出,如:
[nosee@instance-4 ~]$ hexdump -C day1
00000000 09 09 4a 61 6e 75 61 72 79 09 32 30 32 32 09 09 |..January.2022..|
00000010 0a 53 75 09 4d 6f 09 54 75 09 57 65 09 54 68 09 |.Su.Mo.Tu.We.Th.|
00000020 46 72 09 53 61 0a 09 09 09 09 09 09 20 31 0a 20 |Fr.Sa....... 1. |
00000030 32 09 20 33 09 20 34 09 20 35 09 20 36 09 20 37 |2. 3. 4. 5. 6. 7|
00000040 09 20 38 0a 20 39 09 31 30 09 31 31 09 31 32 09 |. 8. 9.10.11.12.|
00000050 31 33 09 31 34 09 31 35 0a 31 36 09 31 37 09 31 |13.14.15.16.17.1|
00000060 38 09 31 39 09 32 30 09 32 31 09 32 32 0a 32 33 |8.19.20.21.22.23|
00000070 09 32 34 09 32 35 09 32 36 09 32 37 09 32 38 09 |.24.25.26.27.28.|
00000080 32 39 0a 33 30 09 33 31 09 09 09 09 09 09 0a 68 |29.30.31.......h|
00000090 61 68 61 0a 68 61 68 61 0a e6 96 b0 e5 95 8a ef |aha.haha........|
000000a0 bc 81 ef bc 81 ef bc 81 ef bc 81 ef bc 81 0a 0a |................|
000000b0 68 61 68 68 61 0a |hahha.|
000000b6
[nosee@instance-4 ~]$
其中,左边是十六进制的偏移,中间是十六进制的数据,右边是数据的ASCII字符。
对于二进制文件而言,文件中没有行,因此行号没有意义。作为替代,我们使用偏移(offset)标记每个位置。偏移就是一个数字,告诉离文件开头有多少字节。偏移不属于数据的内容,是 hexdump 程序加上去的,为了方便程序员阅读。
其中,第一个字节的偏移是 0;第二个字节偏移是 1;以此类推。(记住,1字节=8位=2个十六进制数字)
在大多数二进制文件中,有些字节包含的是实际 ASCII 字符。通过查看最右边的一栏可以方便地识别这些字节。根据约定,没有对应可显示 ASCII 字符的字节一律通过用一个.(点号)字符表示。(如上面的例子,最前面的4a,二进制是01001010,十进制是74,在ASCII码中就是字符J )
二进制文件中的大多数字节都不是字符(有一些只是碰巧会对应于某个字符),而是机器指令、数值数据等。
三、hexdump
hexdump — ASCII, decimal, hexadecimal, octal dump.
语法:
hexdump [-bcCdovx] [-e format_string] [-f format_file] [-n length] [-s offset] file ...
hd [-bcdovx] [-e format_string] [-f format_file] [-n length] [-s offset] file ...
其中,hd
可以相当于是 hexdump -C
。
常用选项:
-
-C
,(大写C) 以规范格式显示一个二进制文件 -
-s offset
,(skip over 略过) 设置初始偏移量指定在文件开头略过多少字节, offset 可以使用任何进制表示的数字。(如,-s 0x120
表示从偏移0x120处开始显示数据) -
n length
,(number of bytes 字节数量) 设置显示字节数, length 为十进制数。 (如,-n 100
表示只显示100个字节的数据)
常用组合语法:hexdump -C [-s offset] [-n length] [file...]
例:
[nosee@instance-4 ~]$ hexdump -C -s 0x120 -n 100 /usr/bin/ls
00000120 01 00 00 00 04 00 00 00 00 70 01 00 00 00 00 00 |.........p......|
00000130 00 70 01 00 00 00 00 00 00 70 01 00 00 00 00 00 |.p.......p......|
00000140 10 89 00 00 00 00 00 00 10 89 00 00 00 00 00 00 |................|
00000150 00 10 00 00 00 00 00 00 01 00 00 00 06 00 00 00 |................|
00000160 90 03 02 00 00 00 00 00 90 13 02 00 00 00 00 00 |................|
00000170 90 13 02 00 00 00 00 00 58 12 00 00 00 00 00 00 |........X.......|
00000180 48 25 00 00 |H%..|
00000184
[nosee@instance-4 ~]$ hd -s 0x120 -n 100 /usr/bin/ls
00000120 01 00 00 00 04 00 00 00 00 70 01 00 00 00 00 00 |.........p......|
00000130 00 70 01 00 00 00 00 00 00 70 01 00 00 00 00 00 |.p.......p......|
00000140 10 89 00 00 00 00 00 00 10 89 00 00 00 00 00 00 |................|
00000150 00 10 00 00 00 00 00 00 01 00 00 00 06 00 00 00 |................|
00000160 90 03 02 00 00 00 00 00 90 13 02 00 00 00 00 00 |................|
00000170 90 13 02 00 00 00 00 00 58 12 00 00 00 00 00 00 |........X.......|
00000180 48 25 00 00 |H%..|
00000184
四、od
od - dump files in octal and other formats.
语法:
od [OPTION]... [FILE]...
od [-abcdfilosx]... [FILE] [[+]OFFSET[.][b]]
od --traditional [OPTION]... [FILE] [[+]OFFSET[.][b] [+][LABEL][.][b]]
常用选项:
-
A
,(address 地址) 指定使用哪一种计数系统表示偏移值。对于规范输出来说,需要将它指定为x
,即-Ax
,这将以十六进制显示偏移。 -
-t
,(type of format 格式类型) 控制数据显示的方式。对于规范输出来说,需要将它指定为x1
(以十六进制显示数据,每次一个字节),和z
(在每行末尾加上相应的ASCII值),即-tx1z
。(注意,这里的1
,是数字1) -
-j
,(jump over 跳过) 指定从文件开头跳过多少字节。(如-j 0x120
,表示从偏移0x120处开始显示数据) -
-N
,(number of bytes 字节数量) 设置显示字节数。 (如,-N 96表示只显示96个字节的数据)
常用组合语法:od -Ax -tx1z [-j offset] [-N length] [file...]
经常使用可以考虑创建别名:alias od='od -Ax -tx1z'
例:
[nosee@instance-4 ~]$ od -Ax -tx1z day1
000000 09 09 4a 61 6e 75 61 72 79 09 32 30 32 32 09 09 >..January.2022..<
000010 0a 53 75 09 4d 6f 09 54 75 09 57 65 09 54 68 09 >.Su.Mo.Tu.We.Th.<
000020 46 72 09 53 61 0a 09 09 09 09 09 09 20 31 0a 20 >Fr.Sa....... 1. <
000030 32 09 20 33 09 20 34 09 20 35 09 20 36 09 20 37 >2. 3. 4. 5. 6. 7<
000040 09 20 38 0a 20 39 09 31 30 09 31 31 09 31 32 09 >. 8. 9.10.11.12.<
000050 31 33 09 31 34 09 31 35 0a 31 36 09 31 37 09 31 >13.14.15.16.17.1<
000060 38 09 31 39 09 32 30 09 32 31 09 32 32 0a 32 33 >8.19.20.21.22.23<
000070 09 32 34 09 32 35 09 32 36 09 32 37 09 32 38 09 >.24.25.26.27.28.<
000080 32 39 0a 33 30 09 33 31 09 09 09 09 09 09 0a 68 >29.30.31.......h<
000090 61 68 61 0a 68 61 68 61 0a e6 96 b0 e5 95 8a ef >aha.haha........<
0000a0 bc 81 ef bc 81 ef bc 81 ef bc 81 ef bc 81 0a 0a >................<
0000b0 68 61 68 68 61 0a >hahha.<
0000b6
[nosee@instance-4 ~]$ od -Ax -tx1z -j 0x120 -N 96 /usr/bin/ls
000120 01 00 00 00 04 00 00 00 00 70 01 00 00 00 00 00 >.........p......<
000130 00 70 01 00 00 00 00 00 00 70 01 00 00 00 00 00 >.p.......p......<
000140 10 89 00 00 00 00 00 00 10 89 00 00 00 00 00 00 >................<
000150 00 10 00 00 00 00 00 00 01 00 00 00 06 00 00 00 >................<
000160 90 03 02 00 00 00 00 00 90 13 02 00 00 00 00 00 >................<
000170 90 13 02 00 00 00 00 00 58 12 00 00 00 00 00 00 >........X.......<
000180
五、参考
书箱:《Unix & Linux 大学教程》第二十一章 (美)Harley Hahn 著 张杰良 译
网友评论