1 概述
hexdump 是 Linux 系统中用于解析文件原始二进制数据的工具,可将任意类型文件(文本文件、二进制可执行文件、数据报文等)按指定格式转换为十六进制、八进制、十进制或 ASCII 字符等形式输出。该工具适用于二进制文件分析、数据校验、协议报文解析等场景,同时支持通过自定义格式字符串实现复杂数据展示需求。
说明:
hd是 hexdump 的简化别名,功能与 hexdump 完全一致,可互换使用。
2 命令格式
bash
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,表示格式模板的应用次数;
- 字节计数:可选正整数,表示每次迭代解析的字节数;
- 格式模板 :必选,需用双引号包裹,遵循
fprintf风格语法,且有以下特殊约束:- 禁止使用
*作为字段宽度/精度占位符; - 对
%s转换符,必须指定字节计数或字段精度; - 不支持转换符:
%、h、l、n、p、q; - 支持 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 转换符会将这些控制字符显示为对应的小写名称。
| 十六进制值 | 缩写 | 英文全称 | 中文释义 | 典型用途 |
|---|---|---|---|---|
| 000 | NUL | Null | 空字符 | 表示数据结束、空值,或用于填充固定长度数据段;在 C 语言中作为字符串结束符 \0 |
| 001 | SOH | Start of Header | 标题开始 | 串行通信中标记"数据报头开始",区分报头与数据体 |
| 002 | STX | Start of Text | 正文开始 | 标记"实际数据内容开始",与 SOH 配合界定数据结构 |
| 003 | ETX | End of Text | 正文结束 | 标记"实际数据内容结束",表示有效数据传输完成 |
| 004 | EOT | End of Transmission | 传输结束 | 标记整个数据传输过程完成(区别于 ETX 仅标记单段正文结束) |
| 005 | ENQ | Enquiry | 询问/查询 | 向对方设备发送"请求响应"信号,验证通信链路是否正常 |
| 006 | ACK | Acknowledgment | 确认 | 接收方回复"已成功接收数据",告知发送方无需重传 |
| 007 | BEL | Bell | 响铃 | 触发设备蜂鸣/响铃(如终端中输入 echo -e '\a' 会发出提示音) |
| 008 | BS | Backspace | 退格 | 光标左移一位(不删除字符,区别于 Delete),对应键盘 Backspace 键 |
| 009 | HT | Horizontal Tab | 水平制表符 | 光标跳至下一个制表位(通常 8 个字符间隔),对应键盘 Tab 键 |
| 00A | LF | Line Feed | 换行 | 光标下移一行,Unix/Linux 系统中用 LF(\n)表示换行 |
| 00B | VT | Vertical Tab | 垂直制表符 | 光标下移一个制表行(极少使用,多见于老式打印机) |
| 00C | FF | Form Feed | 换页 | 触发打印机换页,或终端清屏(部分场景下等同于 Ctrl+L) |
| 00D | CR | Carriage Return | 回车 | 光标回到当前行首,Windows 系统中用 CR+LF(\r\n)表示换行 |
| 00E | SO | Shift Out | 移出 | 切换至扩展字符集(如从 ASCII 主集切换到图形字符集) |
| 00F | SI | Shift In | 移入 | 切换回 ASCII 主字符集(与 SO 配对使用) |
| 010 | DLE | Data Link Escape | 数据链路转义 | 标记后续字符为"控制指令"而非普通数据,用于扩展通信协议 |
| 011 | DC1 | Device Control 1 | 设备控制 1(XON) | 常用作"继续传输"信号(XON),告知发送方恢复数据传输 |
| 012 | DC2 | Device Control 2 | 设备控制 2 | 自定义设备控制指令(如打印机换行、终端模式切换) |
| 013 | DC3 | Device Control 3(XOFF) | 设备控制 3(XOFF) | 常用作"暂停传输"信号(XOFF),告知发送方停止数据传输 |
| 014 | DC4 | Device Control 4 | 设备控制 4 | 自定义设备控制指令(如设备重置、模式恢复) |
| 015 | NAK | Negative Acknowledgment | 否定确认 | 接收方回复"数据接收失败/有误",告知发送方需要重传 |
| 016 | SYN | Synchronous Idle | 同步空闲 | 串行同步通信中,无数据传输时发送的同步填充字符 |
| 017 | ETB | End of Transmission Block | 传输块结束 | 标记"分块传输的单个数据块结束",适用于大文件分块传输场景 |
| 018 | CAN | Cancel | 取消 | 终止当前正在执行的操作(如中断数据传输、取消打印任务) |
| 019 | EM | End of Medium | 介质结束 | 标记"存储介质(如磁带、磁盘)数据结束",表示无更多数据 |
| 01A | SUB | Substitute | 替换 | 替换传输中损坏/无效的字符,避免数据链路中断 |
| 01B | ESC | Escape | 转义 | 触发后续字符为"控制序列"(如终端中 ESC[2J 用于清屏),对应键盘 Esc 键 |
| 01C | FS | File Separator | 文件分隔符 | 多文件合并传输时,分隔不同文件的边界 |
| 01D | GS | Group Separator | 组分隔符 | 分隔数据组(如数据库记录集、批量数据的分组) |
| 01E | RS | Record Separator | 记录分隔符 | 分隔单文件内的多条记录(如 CSV 文件的行分隔,早期无标准化换行时使用) |
| 01F | US | Unit Separator | 单元分隔符 | 分隔单条记录内的字段(如 CSV 文件的列分隔,早期无逗号分隔时使用) |
| 07F | DEL | Delete | 删除 | 擦除当前字符/数据,老式终端中用于删除光标位置字符,对应键盘 Delete 键 |
补充说明
-
显示场景 :hexdump 使用
%_u转换符时,会将这些控制字符替换为上述缩写(如 ASCII 007 显示为bel),而非默认的八进制值或.,便于快速识别控制字符含义; -
实际应用:现代系统中,多数控制字符仅保留兼容意义(如 NUL、LF、CR、TAB、ESC、DEL 仍常用),其余(如 SOH、STX、DC1 等)仅在工业通信、老式设备交互中偶尔使用;
-
编码范围:这些字符均属于 ASCII 0--127 范围内的"非打印字符",无法直接显示为可见符号,hexdump 提供的名称映射是解析二进制文件中控制字符的重要辅助手段。
4.3 转换字符的字节计数规则
不同转换字符对字节计数的要求不同,具体规则如下:
| 转换字符 | 默认字节计数 | 支持的字节计数 |
|---|---|---|
%_c、%_p、%_u、%c |
1 字节 | 仅 1 字节 |
%d、%i、%o、%u、%X、%x |
4 字节 | 1、2、4 字节 |
%E、%e、%f、%G、%g |
8 字节 | 4、12 字节 |
4.4 数据处理规则
- 输入块大小:由格式字符串中所有格式单元的最大数据量(迭代计数 × 字节计数)定义;
- 迭代次数调整:若格式字符串解析的数据量小于输入块,且最后一个格式单元未指定迭代次数,则自动增加迭代次数,直至处理完整个输入块或剩余数据不足;
- 尾随空白符处理:迭代次数 > 1 时,最后一次迭代不输出尾随空白符;
- 数据填充规则:输入数据不足时,用 0 填充剩余部分;填充导致的额外输出将替换为等量空格(按转换字符的字段宽度/精度计算)。
5 应用示例
5.1 默认格式输出
默认执行 -x 选项的双字节十六进制输出,字节顺序遵循主机字节序(x86 架构为小端序),可读性较差:
bash
hexdump testfile
0000000 6148 7070 2079 654e 2077 6559 7261 0a21
*
0000030
5.2 十六进制 + ASCII 混合显示(-C 选项)
解决字节序导致的可读性问题,同时展示十六进制编码与对应 ASCII 字符:
bash
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 组合使用:
bash
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 个字节的内容:
bash
# 输出前 3 个字节
hexdump -Cv testfile -n 3
00000000 48 61 70 |Hap|
00000003
5.5 指定起始偏移量(-s 选项)
从指定偏移量开始解析文件,可结合 -n 限制输出长度:
bash
# 从偏移量 2 开始,输出 1 个字节
hexdump -Cv testfile -s 2 -n 1
00000002 70 |p|
00000003
5.6 单字节八进制显示(-b 选项)
以单字节为单位,按八进制格式输出数据:
bash
hexdump -b testfile
0000000 110 145 154 154 157 040 127 157 162 154 144 041 012
000000d
5.7 自定义格式输出(-e 选项)
示例 1:单字节大写十六进制输出
bash
echo hello | hexdump -v -e '/1 "%02X "' ; echo
68 65 6C 6C 6F 0A
示例 2:十六进制 + ASCII 分栏显示
bash
echo hello | hexdump -e '8/1 "%02X ""\t"" "' -e '8/1 "%c""\n"'
68 65 6C 6C 6F 0A hello
示例 3:生成多格式对照表(偏移量+十六进制+十进制+八进制+ASCII)
bash
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 选项格式
bash
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 选项)
- 创建格式文件
fmt.txt:
txt
# 格式文件:单字节十六进制 + ASCII 字符
/1 "%02x " 8/1 "%_p" "\n"
- 执行命令:
bash
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 注意事项
-v选项的"重复行"指输出行的内容重复,而非文件原始行重复;例如按 16 字节分行时,若连续 16 字节数据重复,未加-v会输出*替代重复行;- hexdump 按文件列表顺序处理输入文件,将数据复制到标准输出并按
-e/-f格式转换; - 未指定任何格式字符串时,默认执行
-x选项的双字节十六进制输出; - 指定字节计数时,格式模板中仅允许一个非
_a/_A类型的转换字符/字符串; - 处理二进制文件时,需注意字节序差异(如大端序与小端序)对数据解析结果的影响,建议结合
-C选项辅助验证。
via:
- Linux 文件管理 : hexdump 命令详解_hexdump命令详解-CSDN博客
https://blog.csdn.net/yexiangCSDN/article/details/89246409 - Linux命令--hexdump(以16进制查看文件内容)_linux hexdump-CSDN博客
https://knife.blog.csdn.net/article/details/125569804 - Linux 常用命令 - hexdump 【以指定格式显示文件内容】-CSDN博客
https://blog.csdn.net/Cris_Jay/article/details/141788591 - Linux命令学习总结:hexdump - 潇湘隐者 - 博客园
https://www.cnblogs.com/kerrycode/p/5077687.html