hexdump命令一般用来查看“二进制”文件的十六进制编码,但实际上它能查看任何文件,而不只限于二进制文件。
语法
hexdump [选项] [文件]...
选项
-n length 只格式化输入文件的前length个字节。
-C 输出规范的十六进制和ASCII码。
-b 单字节八进制显示。
-c 单字节字符显示。
-d 双字节十进制显示。
-o 双字节八进制显示。
-x 双字节十六进制显示。
-s 从偏移量开始输出。
-e 指定格式字符串,格式字符串包含在一对单引号中,格式字符串形如:'a/b "format1" "format2"'。
每个格式字符串由三部分组成,每个由空格分隔,第一个形如a/b,b表示对每b个输入字节应用format1格式,a表示对每a个输入字节应用format2格式,一般a>b,且b只能为1,2,4,另外a可以省略,省略则a=1。format1和format2中可以使用类似printf的格式字符串,如:
%02d:两位十进制
%03x:三位十六进制
%02o:两位八进制
%c:单个字符等
还有一些特殊的用法:
%_ad:标记下一个输出字节的序号,用十进制表示。
%_ax:标记下一个输出字节的序号,用十六进制表示。
%_ao:标记下一个输出字节的序号,用八进制表示。
%_p:对不能以常规字符显示的用 . 代替。
同一行如果要显示多个格式字符串,则可以跟多个-e
选项。
实例
0. 正常输出
hexdump testfile
0000000 6148 7070 2079 654e 2077 6559 7261 0a21
*
0000030
这种方式是以两个字节为一组,其顺序取决于本机字节序。比如在x86架构上就是以blittle-endian方式显示,看起来会很费劲。
如第一行翻译成ascii码:
6148 7070 2079 654e 2077 6559 7261 0a21
aH pp y Ne w e ae !r
为了避免这种情况,就要用到下面的”以字节方式查看“ -C
1. -C 输出十六进制和对应字符
hexdump -C testfile -s skip -n number
00000000 48 61 70 70 79 20 4e 65 77 20 59 65 61 72 21 0a |Happy New Year!.|
*
00000030
这种方式就不会有字节序问题了,而且还能同时显示16进制与ascii码,但存在的问题是,如果某几行的内容相同,会省略掉后几行,这个有时也会造成麻烦。如何避免省略呢? -v
2. 不要省略 -v
hexdump -v testfile
0000000 6148 7070 2079 654e 2077 6559 7261 0a21
0000010 6148 7070 2079 654e 2077 6559 7261 0a21
0000020 6148 7070 2079 654e 2077 6559 7261 0a21
0000030
现在省略是没有了,但又回到了两字节显示的老路上,所以我们要把两种方式结合起来。
字节方式显示且不要省略
hexdump -Cv testfile 00000000 48 61 70 70 79 20 4e 65 77 20 59 65 61 72 21 0a |Happy New Year!.| 00000010 48 61 70 70 79 20 4e 65 77 20 59 65 61 72 21 0a |Happy New Year!.| 00000020 48 61 70 70 79 20 4e 65 77 20 59 65 61 72 21 0a |Happy New Year!.| 00000030
现在就好看多了,既是以单字节方式显示,又不会省略了。但有时文件很大,我们只想查看其中一段,怎么办呢?
3. -n 只输出给定字节
hexdump -Cv tmp.txt -n 1
00000000 48 |H|
00000001
hexdump -Cv tmp.txt -n 2
00000000 48 61 |Ha|
00000002
hexdump -Cv tmp.txt -n 3
00000000 48 61 70 |Hap|
00000003
4. -s 从偏移量开始输出
hexdump -Cv tmp.txt -s 1 -n 1
00000001 61 |a|
00000002
hexdump -Cv tmp.txt -s 2 -n 1
00000002 70 |p|
00000003
hexdump-Cv tmp.txt -s 3 -n 1
00000003 70 |p|
00000004
5. -e 格式化详解
# hex bytes
% echo hello | hexdump -v -e '/1 "%02X "' ; echo
68 65 6C 6C 6F 0A
# same, with ASCII section
% echo hello | hexdump -e '8/1 "%02X ""\t"" "' -e '8/1 "%c""\n"'
68 65 6C 6C 6F 0A hello
# hex with preceding 'x'
% echo hello | hexdump -v -e '"x" 1/1 "%02X" " "' ; echo
x68 x65 x6C x6C x6F x0A
# one hex byte per line
% echo hello | hexdump -v -e '/1 "%02X\n"'
68
65
6C
6C
6F
0A
# a table of byte#, hex, decimal, octal, ASCII
% echo hello | hexdump -v -e '/1 "%_ad# "' -e '/1 "%02X hex"' -e '/1 " = %03i dec"' -e '/1 " = %03o oct"' -e '/1 " = _%c\_\n"'
0# 68 hex = 104 dec = 150 oct = _h_
1# 65 hex = 101 dec = 145 oct = _e_
2# 6C hex = 108 dec = 154 oct = _l_
3# 6C hex = 108 dec = 154 oct = _l_
4# 6F hex = 111 dec = 157 oct = _o_
5# 0A hex = 010 dec = 012 oct = _
_
# byte# & ASCII with control chars
% echo hello | hexdump -v -e '/1 "%_ad# "' -e '/1 " _%_u\_\n"'
0# _h_
1# _e_
2# _l_
3# _l_
4# _o_
5# _lf_
最后再来个模仿:
yexiang@ubuntu:<sbin>$ hexdump -C fsck
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 02 00 3e 00 01 00 00 00 d0 2f 40 00 00 00 00 00 |..>....../@.....|
00000020 40 00 00 00 00 00 00 00 58 a5 00 00 00 00 00 00 |@.......X.......|
00000030 00 00 00 00 40 00 38 00 09 00 40 00 1d 00 1c 00 |....@.8...@.....|
00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 |........@.......|
00000050 40 00 40 00 00 00 00 00 40 00 40 00 00 00 00 00 |@.@.....@.@.....|
...
yexiang@ubuntu:<sbin>$ hexdump -e '1/1 "%08_ax "' -e '8/1 "%02x " " " 8/1 "%02x " " " "|"' -e '16/1 "%_p" "|\n"' fsck
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 02 00 3e 00 01 00 00 00 d0 2f 40 00 00 00 00 00 |..>....../@.....|
00000020 40 00 00 00 00 00 00 00 58 a5 00 00 00 00 00 00 |@.......X.......|
00000030 00 00 00 00 40 00 38 00 09 00 40 00 1d 00 1c 00 |....@.8...@.....|
00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 |........@.......|
00000050 40 00 40 00 00 00 00 00 40 00 40 00 00 00 00 00 |@.@.....@.@.....|
...