1.简介
在计算机科学中,一个 0 或 1 存储的数据称为一个位(bit,代表 binary digit,即二进制数);连续 8 位称为一个字节。
hexdump 可以以可读的格式显示任何类型的二进制数据。
2.规范输出
某种特定格式的二进制文件输出格式称为规范输出,如:
[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 )
二进制文件中的大多数字节都不是字符(有一些只是碰巧会对应于某个字符),而是机器指令、数值数据等。
3.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
注意:十六进制查看文件时,注意区分大小端