Linux xxd 命令详解:从入门到精通

xxd 是 Linux/Unix 系统中一款功能强大的二进制文件分析工具,主要用于将二进制数据转换为十六进制(Hex)格式的“Dump”(转储),或反之将十六进制 Dump 恢复为二进制文件。它广泛应用于开发调试(如分析二进制协议、文件格式)、系统管理(如检查日志或配置文件的二进制内容)、逆向工程等场景。

xxd 通常随 vim-common 包预装在大多数 Linux 发行版中(如 Ubuntu、CentOS),若未安装,可通过包管理器安装(例如 sudo apt install vim-common)。其核心优势在于轻量、灵活,支持自定义输出格式,并能与管道(|)、重定向(>)等 Shell 功能无缝集成。

目录#

  1. 简介
  2. 基本语法与常用选项
  3. 核心功能详解
  4. 高级用法与实战示例
  5. 最佳实践
  6. 常见问题与解决方案
  7. 总结
  8. 参考资料

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 规范(包含偏移量或纯十六进制)。

示例:#

  1. 生成 test.txt 的 Dump 并保存到 dump.txt:

    xxd test.txt > dump.txt
  2. 从 dump.txt 恢复二进制文件 restored.txt:

    xxd -r dump.txt restored.txt
  3. 验证恢复结果:

    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!。

  1. 生成 demo 的十六进制 Dump 并保存:

    xxd demo > demo_dump.txt
  2. 编辑 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,注意长度需一致,避免破坏文件结构)。

  3. 恢复修改后的 Dump 为二进制文件:

    xxd -r demo_dump.txt demo_modified
    chmod +x demo_modified  # 恢复执行权限
  4. 验证结果:

    ./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. 最佳实践#

  1. 修改二进制文件前备份:使用 -r 恢复时,若 Dump 格式错误可能导致文件损坏,建议先备份原始文件(如 cp file file.bak)。

  2. 限制处理范围提升效率:分析大文件时,用 -s 和 -l 仅处理目标区域(如 -s 0x100 -l 0x200),避免全量加载。

  3. 纯十六进制输出用于机器解析:若需通过脚本处理十六进制数据,优先使用 -p(无冗余信息,如 xxd -p file | awk '{...}')。

  4. 生成 C 数组时指定变量名:默认变量名为文件名(如 test.txt→test_txt),可通过 -i <变量名> 自定义(需 xxd 版本 ≥ 1.10):

    xxd -i var_name test.txt  # 数组名改为 var_name
  5. 避免手动编辑大文件 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. 参考资料#

  1. man xxd:Linux 系统内置手册(最权威的选项说明)。
  2. Vim 官方文档 - xxd:xxd 作为 Vim 配套工具的详细说明。
  3. Hexdump 工具对比:xxd vs hexdump:xxd 与其他 Dump 工具的差异分析。
  4. ELF 文件格式详解:结合 xxd 分析 ELF 头部的背景知识。