Linux 常用命令 - hexdump 【以指定格式显示文件内容】

简介

hexdump 可以将指定文件或标准输入按照指定的格式进行输出,其可以用来查看任何文件的原始数据,在分析非文本文件的场景下非常有用。

使用方式

bash 复制代码
hexdump [-bcCdovx] [-e 指定格式] [-f 指定文件] [-n 长度] [-s 偏移] file ...
hd [-bcdovx] [-e 指定格式] [-f 指定文件] [-n 长度] [-s 偏移] file ...

常用选项

  • -b:将数据按一个字节大小分开以8进制格式显示。每行开头将数据的偏移量按十六进制格式显示,接着显示十六个字节的数据,每个字节用空格分隔,占三列宽度,不足三列的用零填充。

  • -c:将数据按一个字节大小分开以字符格式显示。每行开头将数据的偏移量按十六进制格式显示,接着显示十六个字节的数据,每个字节用空格分隔,占三列宽度,不足三列的用空格填充。

  • -C:将数据按规范的十六进制与 ASCII 混合显示。每行开头将数据的偏移量按十六进制格式显示,接着显示十六个字节的数据,宽度为两列,每个字节用空格分隔,然后再显示对应的十六个字节的 ASCII 字符,用 | 包围。

  • -d:每行显示 8 个数据,每个数据由两个字节组成,以无符号十进制形式表示,每个数据占五列宽度,不足五列用零填充,每个数据之间用空格分隔,每行的开头为十六进制显示的数据偏移。

  • -e format_string:指定一个格式字符串用来显示数据。(下文有详细介绍)

  • -f format_file:指定一个包含格式字符串的文件,hexdump 解析这个文件来显示数据。文件内可以有多个字符串,每个字符串独占一行,空行和以 # 开头的行会被忽略。

  • -n length:指定待处理的数据长度。

  • -o:每行显示 8 个数据,每个数据由两个字节组成,以八进制形式表示,每个数据占六列宽度,不足六列用零填充,每个数据间用空格分隔,每行的开头为十六进制显示的数据偏移。

  • -s offset:跳过 offset 指定的偏移量开始读取数据。默认情况下,offset 被解析为一个十进制数,如果以 0x0X 开头,则被解析为十六进制数;如果以 0 开头,则被解析为八进制数。以偏移量以 b,k,m 结尾依次表示乘以 512,1024,1048576

  • -v:显示所有的输入数据。如果不使用 -v ,则 hexdump 会简化输出,如当遇到两组连续输出的行内容完全相同时,第二组及后续的重复行会被替换为一个仅含有 * 的行。

  • -x:每行显示 8 个数据,每个数据由两个字节组成,以十六进制形式表示,每个数据占四列宽度,不足四列用零填充,每个数据间用空格分隔,每行的开头为十六进制显示的数据偏移。

格式 (Formats)

格式字符串可以包含任意数量的格式单元,使用空格分隔。一个单元包含最多三个部分:迭代计数,字节计数以及格式。

迭代计数是一个可选的正整数,默认为 1。每个格式都会应用相应的次数。

字节计数是一个可选的正整数,如果指定了字节计数,则其将定义每次迭代格式时要解析的字节数。

如果指定了迭代计数或字节计数,则必须在迭代计数或(和)字节计数前加一个 / 来进行区分。并且 / 前后的空白字符会被忽略。

格式部分是必须的,且必须用双引号括起来。格式会被解析为 fprintf 风格的字符串,不过存在以下特殊情况:

  • 不能使用星号 * 作为字段宽度或精度的占位符。

  • 对于每个 s 转换字符,必须指定字节计数或字段精度。

  • 不支持以下转换字符:%hlnpq

  • 支持 C 标准中描述的单字符转义序列:

    描述 转义序列
    NUL \0
    警报字符 \a
    退格 \b
    换页 \f
    换行 \n
    回车 \r
    水平制表符 \t
    垂直制表符 \v

hexdump 还支持以下额外的转换字符:

_a[dox]:显示下一个要显示的字节在输入文件中的偏移量,累计计算所有输入文件的偏移量。追加的字符 dox 分别指定为十进制,八进制或十六进制显示。

_A[dox]:与 _a 转换字符串相同,但只在所有输入数据处理完后执行一次。

_c:以默认字符集输出字符。非打印字符显示为三个字符的八进制表示,可以用标准转义符号表示的字符显示为两个字符的字符串。

_p:以默认字符集输出字符,非打印字符显示为单独的 .

_u: 输出 US ASCII 字符,控制字符按照以下小写名称显示,大于 0xff 的字符以十六进制字符串显示:

000 NUL  001 SOH  002 STX  003 ETX  004 EOT  005 ENQ
006 ACK  007 BEL  008 BS   009 HT   00A LF   00B VT
00C FF   00D CR   00E SO   00F SI   010 DLE  011 DC1
012 DC2  013 DC3  014 DC4  015 NAK  016 SYN  017 ETB
018 CAN  019 EM   01A SUB  01B ESC  01C FS   01D GS
01E RS   01F US   07F DEL

各转换字符的默认字节计数与其支持的字节计数如下:

转换字符 默认及支持的字节计数
%_c, %_p, %_u, %c 仅支持1字节
%d, %i, %o, %u, %X, %x 默认4字节, 支持1,2,4字节
%E, %e, %f, %G, %g 默认8字节,支持4,12字节

每个格式字符串解析的数据量是各个格式单元所需数据量的总和。具体来说,每个格式单元的数据量就等于迭代次数乘以字节计数。如果未指定字节计数,则等于迭代次数乘以该格式单元默认所需要的字节数。

输入数据以 "块" 的形式处理,这个块的大小被定义为任意格式字符串制定的最大数据量。对于解析数据量小于一个输入块的格式字符串,其最后一个格式单元既解析了一些字节数又没有指定迭代次数的情况下,这些格式单元的迭代次数会增加,直到整个输入块都被处理完,或者块中剩余数据不足以满足格式字符串的要求。

如果由于用户指定或者 hexdump 自动修改了迭代次数(如上文所述)而使得迭代次数大于1,则在最后一次迭代时不会输出尾随的空白字符。

当输入数据量不足以满足格式字符串的要求时,hexdump 会用零填充剩余部分,以便格式字符串能够完整地显示所有可用的数据。

由上述情形导致的额外输出都将被替换为等量的空格。"等量的空格" 是根据原始转换字符或转换字符串(去掉 + # 这些转换标志)的字段宽度和精度来决定的。

参考示例

1. 以默认形式输出文件内容

bash 复制代码
hexdump test.c

以默认输出格式显示 test.c 的文件内容:

bash 复制代码
jay@jaylinuxlenovo:~/test$ hexdump test.c
0000000 6923 636e 756c 6564 3c20 7473 6964 2e6f
0000010 3e68 230a 6e69 6c63 6475 2065 733c 7274
0000020 6e69 2e67 3e68 230a 6e69 6c63 6475 2065
0000030 733c 6474 6e69 2e74 3e68 0a0a 6975 746e
0000040 5f38 2074 6574 7473 615f 7272 7961 5d5b
0000050 3d20 7b20 7830 3034 202c 7830 3034 202c
0000060 2c30 3020 3b7d 690a 746e 6d20 6961 286e
0000070 2029 0a7b 2020 2020 6e69 2074 2069 203d
0000080 3b30 200a 2020 6920 746e 6a20 3d20 3020
0000090 0a3b 200a 2020 6920 313d 0a3b 2020 2020
00000a0 3d6a 2b69 3b2b 200a 2020 7020 6972 746e
00000b0 2866 6922 203a 6425 202c 3a6a 2520 5c64
00000c0 226e 202c 2c69 6a20 3b29 0a0a 2020 2020
00000d0 6572 7574 6e72 3020 0a3b 007d          
00000db

2. 以八进制形式显示文件内容

bash 复制代码
hexdump -b test.c

使用 -b 选项可以以八进制格式输出:

bash 复制代码
jay@jaylinuxlenovo:~/test$ hexdump -b test.c
0000000 043 151 156 143 154 165 144 145 040 074 163 164 144 151 157 056
0000010 150 076 012 043 151 156 143 154 165 144 145 040 074 163 164 162
0000020 151 156 147 056 150 076 012 043 151 156 143 154 165 144 145 040
0000030 074 163 164 144 151 156 164 056 150 076 012 012 165 151 156 164
0000040 070 137 164 040 164 145 163 164 137 141 162 162 141 171 133 135
0000050 040 075 040 173 060 170 064 060 054 040 060 170 064 060 054 040
0000060 060 054 040 060 175 073 012 151 156 164 040 155 141 151 156 050
0000070 051 040 173 012 040 040 040 040 151 156 164 040 151 040 075 040
0000080 060 073 012 040 040 040 040 151 156 164 040 152 040 075 040 060
0000090 073 012 012 040 040 040 040 151 075 061 073 012 040 040 040 040
00000a0 152 075 151 053 053 073 012 040 040 040 040 160 162 151 156 164
00000b0 146 050 042 151 072 040 045 144 054 040 152 072 040 045 144 134
00000c0 156 042 054 040 151 054 040 152 051 073 012 012 040 040 040 040
00000d0 162 145 164 165 162 156 040 060 073 012 175                    
00000db

3. 以字符形式显示文件内容

bash 复制代码
hexdump -c test.c

使用 -c 选项可以以 ASCII 字符形式显示文件内容:

bash 复制代码
jay@jaylinuxlenovo:~/test$ hexdump -c test.c
0000000   #   i   n   c   l   u   d   e       <   s   t   d   i   o   .
0000010   h   >  \n   #   i   n   c   l   u   d   e       <   s   t   r
0000020   i   n   g   .   h   >  \n   #   i   n   c   l   u   d   e    
0000030   <   s   t   d   i   n   t   .   h   >  \n  \n   u   i   n   t
0000040   8   _   t       t   e   s   t   _   a   r   r   a   y   [   ]
0000050       =       {   0   x   4   0   ,       0   x   4   0   ,    
0000060   0   ,       0   }   ;  \n   i   n   t       m   a   i   n   (
0000070   )       {  \n                   i   n   t       i       =    
0000080   0   ;  \n                   i   n   t       j       =       0
0000090   ;  \n  \n                   i   =   1   ;  \n                
00000a0   j   =   i   +   +   ;  \n                   p   r   i   n   t
00000b0   f   (   "   i   :       %   d   ,       j   :       %   d   \
00000c0   n   "   ,       i   ,       j   )   ;  \n  \n                
00000d0   r   e   t   u   r   n       0   ;  \n   }                    
00000db

4. 以十六进制与 ASCII 混合模式显示文件内容

bash 复制代码
hexdump -C test.c

使用 -C 选项可以以 十六进制与 ASCII 混合模式显示文件内容:

bash 复制代码
jay@jaylinuxlenovo:~/test$ hexdump -C test.c
00000000  23 69 6e 63 6c 75 64 65  20 3c 73 74 64 69 6f 2e  |#include <stdio.|
00000010  68 3e 0a 23 69 6e 63 6c  75 64 65 20 3c 73 74 72  |h>.#include <str|
00000020  69 6e 67 2e 68 3e 0a 23  69 6e 63 6c 75 64 65 20  |ing.h>.#include |
00000030  3c 73 74 64 69 6e 74 2e  68 3e 0a 0a 75 69 6e 74  |<stdint.h>..uint|
00000040  38 5f 74 20 74 65 73 74  5f 61 72 72 61 79 5b 5d  |8_t test_array[]|
00000050  20 3d 20 7b 30 78 34 30  2c 20 30 78 34 30 2c 20  | = {0x40, 0x40, |
00000060  30 2c 20 30 7d 3b 0a 69  6e 74 20 6d 61 69 6e 28  |0, 0};.int main(|
00000070  29 20 7b 0a 20 20 20 20  69 6e 74 20 69 20 3d 20  |) {.    int i = |
00000080  30 3b 0a 20 20 20 20 69  6e 74 20 6a 20 3d 20 30  |0;.    int j = 0|
00000090  3b 0a 0a 20 20 20 20 69  3d 31 3b 0a 20 20 20 20  |;..    i=1;.    |
000000a0  6a 3d 69 2b 2b 3b 0a 20  20 20 20 70 72 69 6e 74  |j=i++;.    print|
000000b0  66 28 22 69 3a 20 25 64  2c 20 6a 3a 20 25 64 5c  |f("i: %d, j: %d\|
000000c0  6e 22 2c 20 69 2c 20 6a  29 3b 0a 0a 20 20 20 20  |n", i, j);..    |
000000d0  72 65 74 75 72 6e 20 30  3b 0a 7d                 |return 0;.}|
000000db

5. 只显示指定字节数的文件内容

bash 复制代码
hexdump -n 16 test.c

使用 -n 选项指定显示 test.c 的前 16 个字节内容:

bash 复制代码
jay@jaylinuxlenovo:~/test$ hexdump -n 16 test.c
0000000 6923 636e 756c 6564 3c20 7473 6964 2e6f
0000010

6. 从指定字节偏移量开始显示文件内容

bash 复制代码
hexdump -s 16 test.c

使用 -s 指定从文件的第 16 个字节开始显示内容:

bash 复制代码
jay@jaylinuxlenovo:~/test$ hexdump -s 16 test.c
0000010 3e68 230a 6e69 6c63 6475 2065 733c 7274
0000020 6e69 2e67 3e68 230a 6e69 6c63 6475 2065
0000030 733c 6474 6e69 2e74 3e68 0a0a 6975 746e
0000040 5f38 2074 6574 7473 615f 7272 7961 5d5b
0000050 3d20 7b20 7830 3034 202c 7830 3034 202c
0000060 2c30 3020 3b7d 690a 746e 6d20 6961 286e
0000070 2029 0a7b 2020 2020 6e69 2074 2069 203d
0000080 3b30 200a 2020 6920 746e 6a20 3d20 3020
0000090 0a3b 200a 2020 6920 313d 0a3b 2020 2020
00000a0 3d6a 2b69 3b2b 200a 2020 7020 6972 746e
00000b0 2866 6922 203a 6425 202c 3a6a 2520 5c64
00000c0 226e 202c 2c69 6a20 3b29 0a0a 2020 2020
00000d0 6572 7574 6e72 3020 0a3b 007d          
00000db

注意事项

  • -v 选项中的重复行指的是输出时显示的行,而不是文件本身内容里的一行数据。比如输出按照 16 个字节一行,那么如果文件中出现与上 16 个字节完全相同的 16 个数据时,hexdump 就会输出一个 * ,直到遇到不相同的数据。

  • 对于每一个指定的输入文件,hexdump 都会按顺序复制输入数据到标准输出,并且根据 -e-f 选项指定的格式转换数据。

  • 如果没有指定任何格式字符串,则默认会执行与 -x 选项相同的操作。

  • 如果指定了字节计数,则不能同时指定多个转换字符或字符串,除非除了一个之外所有转换字符或字符串是 _a_A

相关推荐
_.Switch14 分钟前
Python 自动化运维持续优化与性能调优
运维·开发语言·python·缓存·自动化·运维开发
南猿北者19 分钟前
Docker Volume
运维·docker·容器
矛取矛求3 小时前
Linux如何更优质调节系统性能
linux
内核程序员kevin4 小时前
在Linux环境下使用Docker打包和发布.NET程序并配合MySQL部署
linux·mysql·docker·.net
kayotin4 小时前
Wordpress博客配置2024
linux·mysql·docker
Ztiddler5 小时前
【Linux Shell命令-不定期更新】
linux·运维·服务器·ssh
小小不董5 小时前
Oracle OCP认证考试考点详解082系列16
linux·运维·服务器·数据库·oracle·dba
IPdodo全球网络5 小时前
如何利用静态住宅IP优化Facebook商城的网络稳定性与运营效率
运维·服务器
a1denzzz6 小时前
Linux系统的网络设置
linux·服务器·网络
运维&陈同学6 小时前
【模块一】kubernetes容器编排进阶实战之k8s基础概念
运维·docker·云原生·容器·kubernetes·云计算