Linux | hexdump 命令

1 概述

hexdump 是 Linux 系统中用于解析文件原始二进制数据的工具,可将任意类型文件(文本文件、二进制可执行文件、数据报文等)按指定格式转换为十六进制、八进制、十进制或 ASCII 字符等形式输出。该工具适用于二进制文件分析、数据校验、协议报文解析等场景,同时支持通过自定义格式字符串实现复杂数据展示需求。

说明:hd 是 hexdump 的简化别名,功能与 hexdump 完全一致,可互换使用。

2 命令格式

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

3 选项详解

选项功能描述
-b单字节八进制显示:
- 行首输出十六进制偏移量;
- 每行显示 16 个字节的八进制值,每个字节占 3 列宽度,不足部分以 0 填充;
- 字节间用空格分隔。
-c单字节字符显示:
- 行首输出十六进制偏移量;
- 每行显示 16 个字节的 ASCII 字符,每个字节占 3 列宽度,不足部分以空格填充;
- 字节间用空格分隔。
-C规范十六进制 + ASCII 混合显示:
- 行首输出十六进制偏移量;
- 后续先显示 16 个字节的两位十六进制值(字节间空格分隔);
- 末尾用 `
-d双字节无符号十进制显示:
- 行首输出十六进制偏移量;
- 每行显示 8 个双字节数据,每个数据占 5 列宽度,不足部分以 0 填充;
- 数据间用空格分隔。
-e format_string自定义格式字符串解析数据,格式规则详见 4 格式字符串说明。
-f format_file从指定文件读取格式字符串:
- 文件内每个格式字符串独占一行;
- 空行和以 # 开头的注释行将被忽略。
-n length仅处理输入数据的前 length 个字节,超出部分不解析。
-o双字节八进制显示:
- 行首输出十六进制偏移量;
- 每行显示 8 个双字节数据,每个数据占 6 列宽度,不足部分以 0 填充;
- 数据间用空格分隔。
-s offset跳过前 offset 字节的偏移量后开始读取数据,偏移量解析规则:
- 十进制(默认);
- 十六进制(以 0x/0X 开头);
- 八进制(以 0 开头);
- 支持单位扩展:b(×512)、k(×1024)、m(×1048576)。
-v显示全部输入数据,禁用重复行压缩;未使用该选项时,连续重复的行将被替换为仅含 * 的行。
-x双字节十六进制显示:
- 行首输出十六进制偏移量;
- 每行显示 8 个双字节数据,每个数据占 4 列宽度,不足部分以 0 填充;
- 数据间用空格分隔。

4 格式字符串(Formats)规则

格式字符串由若干格式单元组成,单元间以空格分隔;单个格式单元最多包含迭代计数、字节计数、格式模板三部分,用于自定义数据解析与输出形式。

4.1 格式单元组成

  1. 迭代计数:可选正整数,默认值为 1,表示格式模板的应用次数;
  2. 字节计数:可选正整数,表示每次迭代解析的字节数;
  3. 格式模板:必选,需用双引号包裹,遵循 fprintf 风格语法,且有以下特殊约束:
    • 禁止使用 * 作为字段宽度/精度占位符;
    • %s 转换符,必须指定字节计数或字段精度;
    • 不支持转换符:%hlnpq
    • 支持 C 标准单字符转义序列(如下表):
转义序列描述
\0空字符(NUL)
\a警报字符
\b退格
\t水平制表符
\f换页
\n换行
\r回车
\v垂直制表符

4.2 扩展转换字符

hexdump 额外支持以下转换字符(用于格式模板),可实现偏移量标记、字符替换等功能:

转换字符功能描述
%_a[dox]显示下一字节的累计偏移量;d(十进制)、o(八进制)、x(十六进制)
%_A[dox]%_a 功能一致,但仅在所有数据处理完成后执行一次
%_c输出默认字符集;非打印字符显示为 3 位八进制值,可转义字符显示为 2 位转义字符串
%_p输出默认字符集;非打印字符替换为 .
%_u输出 US ASCII 字符;控制字符显示为小写名称(如下表),大于 0xff 的字符显示为十六进制字符串
US ASCII 控制字符名称映射(%_u)
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
US ASCII 控制字符(000~01F、07F)释义

上述字符属于 US ASCII 编码中不可打印的控制字符(ASCII 码值 0–31 及 127),最初设计用于串行通信、数据传输控制等场景,hexdump 的 %_u 转换符会将这些控制字符显示为对应的小写名称。

十六进制值缩写英文全称中文释义典型用途
000NULNull空字符表示数据结束、空值,或用于填充固定长度数据段;在 C 语言中作为字符串结束符 \0
001SOHStart of Header标题开始串行通信中标记“数据报头开始”,区分报头与数据体
002STXStart of Text正文开始标记“实际数据内容开始”,与 SOH 配合界定数据结构
003ETXEnd of Text正文结束标记“实际数据内容结束”,表示有效数据传输完成
004EOTEnd of Transmission传输结束标记整个数据传输过程完成(区别于 ETX 仅标记单段正文结束)
005ENQEnquiry询问/查询向对方设备发送“请求响应”信号,验证通信链路是否正常
006ACKAcknowledgment确认接收方回复“已成功接收数据”,告知发送方无需重传
007BELBell响铃触发设备蜂鸣/响铃(如终端中输入 echo -e '\a' 会发出提示音)
008BSBackspace退格光标左移一位(不删除字符,区别于 Delete),对应键盘 Backspace
009HTHorizontal Tab水平制表符光标跳至下一个制表位(通常 8 个字符间隔),对应键盘 Tab
00ALFLine Feed换行光标下移一行,Unix/Linux 系统中用 LF(\n)表示换行
00BVTVertical Tab垂直制表符光标下移一个制表行(极少使用,多见于老式打印机)
00CFFForm Feed换页触发打印机换页,或终端清屏(部分场景下等同于 Ctrl+L
00DCRCarriage Return回车光标回到当前行首,Windows 系统中用 CR+LF(\r\n)表示换行
00ESOShift Out移出切换至扩展字符集(如从 ASCII 主集切换到图形字符集)
00FSIShift In移入切换回 ASCII 主字符集(与 SO 配对使用)
010DLEData Link Escape数据链路转义标记后续字符为“控制指令”而非普通数据,用于扩展通信协议
011DC1Device Control 1设备控制 1(XON)常用作“继续传输”信号(XON),告知发送方恢复数据传输
012DC2Device Control 2设备控制 2自定义设备控制指令(如打印机换行、终端模式切换)
013DC3Device Control 3(XOFF)设备控制 3(XOFF)常用作“暂停传输”信号(XOFF),告知发送方停止数据传输
014DC4Device Control 4设备控制 4自定义设备控制指令(如设备重置、模式恢复)
015NAKNegative Acknowledgment否定确认接收方回复“数据接收失败/有误”,告知发送方需要重传
016SYNSynchronous Idle同步空闲串行同步通信中,无数据传输时发送的同步填充字符
017ETBEnd of Transmission Block传输块结束标记“分块传输的单个数据块结束”,适用于大文件分块传输场景
018CANCancel取消终止当前正在执行的操作(如中断数据传输、取消打印任务)
019EMEnd of Medium介质结束标记“存储介质(如磁带、磁盘)数据结束”,表示无更多数据
01ASUBSubstitute替换替换传输中损坏/无效的字符,避免数据链路中断
01BESCEscape转义触发后续字符为“控制序列”(如终端中 ESC[2J 用于清屏),对应键盘 Esc
01CFSFile Separator文件分隔符多文件合并传输时,分隔不同文件的边界
01DGSGroup Separator组分隔符分隔数据组(如数据库记录集、批量数据的分组)
01ERSRecord Separator记录分隔符分隔单文件内的多条记录(如 CSV 文件的行分隔,早期无标准化换行时使用)
01FUSUnit Separator单元分隔符分隔单条记录内的字段(如 CSV 文件的列分隔,早期无逗号分隔时使用)
07FDELDelete删除擦除当前字符/数据,老式终端中用于删除光标位置字符,对应键盘 Delete
补充说明
  1. 显示场景:hexdump 使用 %_u 转换符时,会将这些控制字符替换为上述缩写(如 ASCII 007 显示为 bel),而非默认的八进制值或 .,便于快速识别控制字符含义;

  2. 实际应用:现代系统中,多数控制字符仅保留兼容意义(如 NUL、LF、CR、TAB、ESC、DEL 仍常用),其余(如 SOH、STX、DC1 等)仅在工业通信、老式设备交互中偶尔使用;

  3. 编码范围:这些字符均属于 ASCII 0–127 范围内的“非打印字符”,无法直接显示为可见符号,hexdump 提供的名称映射是解析二进制文件中控制字符的重要辅助手段。

4.3 转换字符字节宽度

4.3.1 字节宽度定义

“字节宽度”系指单个格式单元在一次迭代中从输入流截取并参与格式化的字节数
宽度值应由“迭代次数/字节宽度”语法显式指定;若省略,则采用表 1 规定的默认值。

4.3.2 允许宽度取值

表 1 列出的宽度值为唯一合法取值,超出范围视为格式串错误,工具应返回非零退出码并给出诊断信息。

表 1 转换字符字节宽度要求

类别转换字符默认宽度合法显式宽度备注
字符%c %_c %_p %_u1仅 1不可更改
整数%d %i %o %u %x %X41、2、4用“数字/”前缀指定,如 %2x
浮点%f %e %g %F %E %G84、8、12须用长度修饰符:_F(4)、_D(8)、_L(12)
4.3.3 字符类转换

a) 宽度必须为 1;任何 ≠1 的指定导致错误。
b) 功能差异(规范行为):

  • %c:可打印字符原样输出,其余按 C 转义序列显示。
  • %_c:控制字符(0x00–0x1F 及 0x7F)输出 3 位八进制,其余原样输出。
  • %_p:不可打印字符统一替换为“.”(0x2E)。
  • %_u:控制字符输出标准化缩写(NUL、BEL …),其余原样输出。
4.3.4 整数类转换

a) 多字节数据按主机字节序解析;需非主机序时,用户先使用 dd conv=swab 等工具完成字节序调整。
b) 格式串中的“数字/”前缀允许 1、2、4;其余值视为错误。

4.3.5 浮点类转换

a) 非默认宽度必须显式使用长度修饰符;未指定时一律按 8 字节处理。

b) _L(12 字节)对应平台相关的 extended precision;实际长度由 sizeof(long double) 决定。

c) 在 x86 Linux 上,80-bit extended 占 16 字节(10 字节有效+6 字节填充),hexdump 仍按 12 字节截取,多读 2 字节填充位,导致后续数据错位;生产代码禁止依赖 _L

AArch64、PowerPC 等 128-bit 格式若被截成 12 字节,后续数据同时错位。
旧版 macOS long double 等同 double_L_D 效果一致。

d) 可移植脚本优先使用 _F_D;必须观察 extended 时,先用 dd 取前 10 字节并补 2 字节 0 再喂给 _L,或改用 objdump -F、Python struct 等专用工具。

4.4 数据处理

4.4.1 输入块大小

输入块大小由公式(1)计算:

input_block = max(iter_count[i] × byte_width[i])   …(1)

其中 i 遍历格式串中所有格式单元。

4.4.2 迭代次数自动延伸

当且仅当同时满足:
a) 已解析数据量 < 输入块大小;
b) 最后一个格式单元未指定迭代次数;
工具自动增加该单元迭代次数,直至处理完整个输入块或剩余数据不足一次迭代。

4.4.3 尾随空白符抑制

若某一格式单元的迭代次数 >1,则最后一次迭代不得输出尾随空白符(空格、制表符、换行符)。

4.4.4 数据不足时的填充规则

a) 输入数据不足部分按 0 填充;
b) 填充导致的额外输出替换为等量空格,空格数量按转换字符的字段宽度/精度计算;
c) 填充操作不得改变后续数据的字节偏移。

4.5 规范性限制

  1. 指定宽度必须落在表 1 允许范围,否则报错。
  2. 多字节数据解析结果受主机字节序影响;跨平台脚本显式处理字节序。
  3. 12 字节 extended 格式为非标准格式,正式环境禁止依赖 _L
  4. 不同系统实现细节可能存在差异,使用前查阅本地手册页。

5 应用示例

5.1 默认格式输出

默认执行 -x 选项的双字节十六进制输出,字节顺序遵循主机字节序(x86 架构为小端序),可读性较差:

hexdump testfile
0000000 6148 7070 2079 654e 2077 6559 7261 0a21
*
0000030

5.2 十六进制 + ASCII 混合显示(-C 选项)

解决字节序导致的可读性问题,同时展示十六进制编码与对应 ASCII 字符:

hexdump -C testfile
00000000  48 61 70 70 79 20 4e 65  77 20 59 65 61 72 21 0a  |Happy New Year!.|
*
00000030

5.3 禁用重复行压缩(-v 选项)

保留所有输出行,不使用 * 替代重复行,常与 -C 组合使用:

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

5.4 限制输出字节数(-n 选项)

仅输出文件前 N 个字节的内容:

# 输出前 3 个字节
hexdump -Cv testfile -n 3
00000000  48 61 70                                          |Hap|
00000003

5.5 指定起始偏移量(-s 选项)

从指定偏移量开始解析文件,可结合 -n 限制输出长度:

# 从偏移量 2 开始,输出 1 个字节
hexdump -Cv testfile -s 2 -n 1
00000002  70                                                |p|
00000003

5.6 单字节八进制显示(-b 选项)

以单字节为单位,按八进制格式输出数据:

hexdump -b testfile
0000000 110 145 154 154 157 040 127 157 162 154 144 041 012
000000d

5.7 自定义格式输出(-e 选项)

示例 1:单字节大写十六进制输出
echo hello | hexdump -v -e '/1 "%02X "' ; echo
68 65 6C 6C 6F 0A
示例 2:十六进制 + ASCII 分栏显示
echo hello | hexdump -e '8/1 "%02X ""\t"" "' -e '8/1 "%c""\n"'
68 65 6C 6C 6F 0A        hello
示例 3:生成多格式对照表(偏移量+十六进制+十进制+八进制+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 = __
示例 4:模拟 -C 选项格式
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  |..>....../@.....|

5.8 从文件读取格式规则(-f 选项)

  1. 创建格式文件 fmt.txt
    # 格式文件:单字节十六进制 + ASCII 字符
    /1 "%02x " 8/1 "%_p" "\n"
    
  2. 执行命令:
    hexdump -f fmt.txt testfile
    48 61 70 70 79 20 4e 65 happy ne
    77 20 59 65 61 72 21 0a w year!.
    

6 注意事项

  1. -v 选项的“重复行”指输出行的内容重复,而非文件原始行重复;例如按 16 字节分行时,若连续 16 字节数据重复,未加 -v 会输出 * 替代重复行;
  2. hexdump 按文件列表顺序处理输入文件,将数据复制到标准输出并按 -e/-f 格式转换;
  3. 未指定任何格式字符串时,默认执行 -x 选项的双字节十六进制输出;
  4. 指定字节计数时,格式模板中仅允许一个非 _a/_A 类型的转换字符/字符串;
  5. 处理二进制文件时,需注意字节序差异(如大端序与小端序)对数据解析结果的影响,建议结合 -C 选项辅助验证。
  6. 如无特别说明,均以 GNU hexdump 实现为准,其它实现差异处已单独标注。

via:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值