Linux xxd 命令详解:从入门到精通
xxd 是 Linux/Unix 系统中一款功能强大的二进制文件分析工具,主要用于将二进制数据转换为十六进制(Hex)格式的“Dump”(转储),或反之将十六进制 Dump 恢复为二进制文件。它广泛应用于开发调试(如分析二进制协议、文件格式)、系统管理(如检查日志或配置文件的二进制内容)、逆向工程等场景。
xxd 通常随 vim-common 包预装在大多数 Linux 发行版中(如 Ubuntu、CentOS),若未安装,可通过包管理器安装(例如 sudo apt install vim-common)。其核心优势在于轻量、灵活,支持自定义输出格式,并能与管道(|)、重定向(>)等 Shell 功能无缝集成。
目录#
- 简介
- 基本语法与常用选项
- 核心功能详解
- 3.1 生成十六进制 Dump
- 3.2 从十六进制 Dump 恢复二进制文件
- 3.3 自定义输出格式
- 3.4 处理部分文件内容
- 高级用法与实战示例
- 4.1 查看二进制文件头部信息
- 4.2 修改二进制文件内容
- 4.3 与其他命令结合使用
- 4.4 生成特定格式输出(如 C 数组)
- 最佳实践
- 常见问题与解决方案
- 总结
- 参考资料
1. 简介#
xxd 是 Linux/Unix 系统中一款功能强大的二进制文件分析工具,主要用于将二进制数据转换为十六进制(Hex)格式的“Dump”(转储),或反之将十六进制 Dump 恢复为二进制文件。它广泛应用于开发调试(如分析二进制协议、文件格式)、系统管理(如检查日志或配置文件的二进制内容)、逆向工程等场景。
xxd 通常随 vim-common 包预装在大多数 Linux 发行版中(如 Ubuntu、CentOS),若未安装,可通过包管理器安装(例如 sudo apt install vim-common)。其核心优势在于轻量、灵活,支持自定义输出格式,并能与管道(|)、重定向(>)等 Shell 功能无缝集成。
2. 基本语法与常用选项#
基本语法#
xxd [选项] [输入文件 [输出文件]]- 若未指定
输入文件,xxd从标准输入(stdin)读取数据; - 若未指定
输出文件,结果输出到标准输出(stdout); - 核心功能:正向转换(二进制→十六进制 Dump)和反向转换(十六进制 Dump→二进制)。
常用选项#
| 选项 | 功能描述 |
|---|---|
-l <长度> | 限制读取的字节数(如 -l 32 仅处理前 32 字节) |
-s <偏移> | 从文件指定偏移量(单位:字节,支持十六进制前缀 0x,如 -s 0x100)开始读取 |
-c <列数> | 每行显示的字节数(默认 16,如 -c 8 每行 8 字节) |
-g <字节数> | 十六进制字节的分组大小(默认 2 字节一组,-g 0 禁用分组) |
-p | 纯十六进制输出(仅打印字节,无偏移量、ASCII 列,适合机器解析) |
-r | 反向转换:将十六进制 Dump 恢复为二进制文件 |
-u | 十六进制字母大写(默认小写,如 a→A) |
-b | 输出二进制 Dump(而非十六进制,每个字节显示为 8 位二进制数) |
-i | 生成 C 语言风格的数组定义(如 unsigned char file[] = {0x12, 0x34, ...};) |
3. 核心功能详解#
3.1 生成十六进制 Dump#
xxd 最基础的用法是生成文件的十六进制 Dump。例如,创建一个测试文件 test.txt:
echo "Hello xxd!" > test.txt执行 xxd test.txt,输出如下:
00000000: 4865 6c6c 6f20 7878 6421 0a Hello xxd!.
输出格式解析:#
- 偏移量(00000000):文件起始位置的字节偏移(十六进制,共 8 位,对应 32 位地址空间);
- 十六进制字节(4865 6c6c 6f20 7878 6421 0a):二进制数据的十六进制表示(默认 2 字节一组,共 16 字节/行);
- ASCII 列(Hello xxd!.):可打印字符的 ASCII 表示(不可打印字符用
.代替,如换行符0a显示为.)。
3.2 从十六进制 Dump 恢复二进制文件#
xxd -r 选项用于反向转换:将十六进制 Dump 恢复为原始二进制文件。前提是输入的 Dump 格式需符合 xxd 规范(包含偏移量或纯十六进制)。
示例:#
-
生成
test.txt的 Dump 并保存到dump.txt:xxd test.txt > dump.txt -
从
dump.txt恢复二进制文件restored.txt:xxd -r dump.txt restored.txt -
验证恢复结果:
diff test.txt restored.txt # 无输出,说明内容一致
注意:若 Dump 是通过
-p(纯十六进制)生成的,恢复时需配合-p:xxd -p test.txt > plain_dump.txt # 纯十六进制输出(无偏移量、ASCII) xxd -r -p plain_dump.txt restored_p.txt # 恢复纯十六进制 Dump
3.3 自定义输出格式#
xxd 支持通过选项调整输出格式,满足不同场景需求。
示例 1:调整每行字节数(-c)#
默认每行 16 字节,若需每行 8 字节:
xxd -c 8 test.txt # 每行 8 字节输出:
00000000: 48656c6c 6f207878 Helloxx
00000008: 64210a d!.
示例 2:修改十六进制分组(-g)#
默认 2 字节一组,若需 4 字节一组:
xxd -g 4 test.txt # 4 字节一组输出:
00000000: 48656c6c 6f207878 64210a Hello xxd!.
示例 3:纯十六进制输出(-p)#
仅保留十六进制字节,无偏移量和 ASCII 列,适合管道传递给其他工具(如 md5sum):
xxd -p test.txt # 输出:48656c6c6f20787864210a示例 4:二进制 Dump(-b)#
输出二进制而非十六进制(每个字节显示为 8 位二进制数):
xxd -b test.txt # 二进制 Dump输出:
00000000: 01001000 01100101 01101100 01101100 01101111 00100000 01111000 01111000 Helloxx
00000008: 01100100 00100001 00001010 d!.
3.4 处理部分文件内容#
通过 -s(起始偏移)和 -l(长度限制)选项,可仅处理文件的部分内容,避免全量加载大文件。
示例 1:从指定偏移量开始读取#
读取 test.txt 从第 6 字节(偏移量 0x5,十六进制)开始的内容:
xxd -s 0x5 test.txt # 偏移量 0x5(十进制 5)test.txt 内容为 Hello xxd!\n(字节序列:48 65 6c 6c 6f 20 78 78 64 21 0a),偏移 5 对应字节 20(空格),输出:
00000005: 2078 7864 210a xxd!.
示例 2:限制读取长度#
仅读取 test.txt 的前 5 字节:
xxd -l 5 test.txt # 限制 5 字节输出:
00000000: 4865 6c6c 6f Hello
4. 高级用法与实战示例#
4.1 查看二进制文件头部信息#
许多文件格式(如 ELF 可执行文件、PNG 图片)的头部包含关键元信息(如魔数、版本号)。xxd 可快速提取头部信息。
示例:分析 ELF 可执行文件头部#
ELF 文件头部前 16 字节包含魔数(7f 45 4c 46)和版本信息,通过 -l 限制读取前 64 字节:
xxd -l 64 /bin/ls # 查看 /bin/ls 的前 64 字节输出前几行:
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
00000010: 0300 3e00 0100 0000 505a 0000 0000 0000 ..>.....PZ......
- 前 4 字节
7f 45 4c 46是 ELF 魔数,用于标识文件类型。
4.2 修改二进制文件内容#
通过 xxd 生成 Dump、手动编辑后恢复,可实现二进制文件的修改(需谨慎操作!)。
示例:修改字符串常量#
假设有一个 C 程序 demo.c:
#include <stdio.h>
int main() { printf("Hello, World!\n"); return 0; }编译为 demo 并运行:
gcc demo.c -o demo && ./demo # 输出:Hello, World!目标:将输出改为 Hello, xxd!。
-
生成
demo的十六进制 Dump 并保存:xxd demo > demo_dump.txt -
编辑
demo_dump.txt,搜索字符串Hello, World!对应的十六进制(48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21),替换为Hello, xxd!(48 65 6c 6c 6f 2c 20 78 78 64 21,注意长度需一致,避免破坏文件结构)。 -
恢复修改后的 Dump 为二进制文件:
xxd -r demo_dump.txt demo_modified chmod +x demo_modified # 恢复执行权限 -
验证结果:
./demo_modified # 输出:Hello, xxd!
4.3 与其他命令结合使用#
xxd 可通过管道与 grep、sed、awk 等工具结合,实现复杂分析任务。
示例 1:搜索二进制文件中的特定字节序列#
查找 /bin/ls 中是否包含 7f 45 4c 46(ELF 魔数):
xxd /bin/ls | grep "7f45 4c46" # 魔数对应十六进制字符串 "7f45 4c46"输出:
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
示例 2:计算文件的十六进制哈希#
结合 sha256sum 计算纯十六进制形式的文件哈希:
xxd -p test.txt | sha256sum # 纯十六进制→哈希4.4 生成特定格式输出(如 C 数组)#
-i 选项可将文件内容转换为 C 语言数组,方便嵌入式开发或代码中嵌入二进制数据。
示例:生成 C 数组#
xxd -i test.txt # 输出 C 数组定义输出:
unsigned char test_txt[] = {
0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x78, 0x78, 0x64, 0x21, 0x0a
};
unsigned int test_txt_len = 11;可直接将此代码复制到 C 程序中使用。
5. 最佳实践#
-
修改二进制文件前备份:使用
-r恢复时,若 Dump 格式错误可能导致文件损坏,建议先备份原始文件(如cp file file.bak)。 -
限制处理范围提升效率:分析大文件时,用
-s和-l仅处理目标区域(如-s 0x100 -l 0x200),避免全量加载。 -
纯十六进制输出用于机器解析:若需通过脚本处理十六进制数据,优先使用
-p(无冗余信息,如xxd -p file | awk '{...}')。 -
生成 C 数组时指定变量名:默认变量名为文件名(如
test.txt→test_txt),可通过-i <变量名>自定义(需xxd版本 ≥ 1.10):xxd -i var_name test.txt # 数组名改为 var_name -
避免手动编辑大文件 Dump:若需修改大文件,建议使用专业十六进制编辑器(如
hexedit),或通过vim集成xxd编辑(见下方技巧):vim file # 打开文件后执行 :%!xxd 进入十六进制编辑模式,修改后执行 :%!xxd -r 保存
6. 常见问题与解决方案#
问题 1:反向转换(-r)失败,提示“invalid input”#
原因:输入 Dump 格式不符合 xxd 要求(如包含非十六进制字符、偏移量错误)。
解决方案:
- 若 Dump 是纯十六进制(无偏移量),恢复时需加
-p:xxd -r -p plain_dump.txt out.bin; - 确保 Dump 中偏移量递增且无重复,删除注释或无关行。
问题 2:xxd -r 生成的文件大小异常#
原因:Dump 中存在超过文件实际长度的偏移量(如手动添加了无效偏移行)。
解决方案:用 -l 限制恢复长度,或清理 Dump 中无效的偏移行。
问题 3:二进制 Dump(-b)输出混乱#
原因:-b 按位显示每个字节,适合分析位级数据,若需可读性优先,建议用默认十六进制模式。
解决方案:结合 -c 减少每行字节数(如 -b -c 4 每行 4 字节)。
7. 总结#
xxd 是一款轻量但功能强大的二进制分析工具,核心价值在于十六进制与二进制的双向转换及灵活的输出定制。通过本文介绍的基础用法(如生成 Dump、恢复文件)、高级技巧(如修改二进制、生成 C 数组)和最佳实践,开发者和系统管理员可高效处理二进制数据相关任务。
掌握 xxd 不仅能提升日常工作效率,更能深入理解文件格式、协议结构等底层细节,是 Linux 工具链中不可或缺的一员。
8. 参考资料#
man xxd:Linux 系统内置手册(最权威的选项说明)。- Vim 官方文档 - xxd:
xxd作为 Vim 配套工具的详细说明。 - Hexdump 工具对比:xxd vs hexdump:
xxd与其他 Dump 工具的差异分析。 - ELF 文件格式详解:结合
xxd分析 ELF 头部的背景知识。