Linux 文件管理 : hexdump 命令详解

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

 

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HarkerYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值