Linux xxd 命令(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在编程与系统运维领域,数据的底层呈现形式常常是开发者需要直面的挑战。无论是调试二进制文件、逆向工程,还是修复意外损坏的数据,Linux 环境中一个看似小众却极其强大的工具——xxd 命令——都能成为你的得力助手。本文将从基础到进阶,通过案例和比喻,带你全面掌握这一工具的使用逻辑与应用场景。


一、什么是 xxd 命令?它的核心功能是什么?

1.1 命令的定位与比喻

xxd 命令可以理解为一个“二进制翻译官”。它能够将文件内容以十六进制(Hex)和 ASCII 码的混合形式展示,同时支持将这种格式反向转换为原始文件。这如同一位精通多语言的翻译者,能将人类难以直接阅读的二进制数据,转化为开发者可以理解的文本形式。

1.2 核心功能概述

  • Hex Dump:将文件内容转为十六进制和 ASCII 码的混合显示。
  • 反向转换:将十六进制文本还原为原始二进制文件。
  • 数据截取与拼接:通过偏移量和列宽参数,精确控制数据处理范围。
  • 调试与修复:在文件损坏或加密场景中,定位问题并修改数据。

二、基础用法:从零开始掌握 xxd

2.1 最简命令格式与输出解析

示例 1:将文本文件转为十六进制

echo "Hello World" > test.txt
xxd test.txt

输出示例:

00000000: 4865 6c6c 6f20 576f 726c 640a          Hello World.

解读

  • 左侧 00000000 是字节偏移量(以十六进制表示)。
  • 中间 48656c6c... 是十六进制数据,每两位代表一个字节。
  • 右侧是对应的 ASCII 码字符(非打印字符用 . 表示)。

示例 2:将十六进制文本还原为文件

假设我们有以下内容保存为 hex.txt

00000000: 4865 6c6c 6f20 576f 726c 640a  

执行:

xxd -r hex.txt output.txt
cat output.txt  # 输出 "Hello World\n"

关键参数解释

  • -r:反向转换(Reverse),将十六进制文本转为原始数据。
  • -p:仅输出十六进制部分(省略 ASCII 列),常用于与其他工具配合。

2.2 常用参数详解与比喻

参数 1:-s <offset>(偏移量)

作用:跳过前 <offset> 字节后开始读取。
比喻:如同在书本中直接翻到第 50 页开始阅读,而忽略前面的内容。
示例:

xxd -s 0x10 test.txt  # 从第 16 字节开始读取(十六进制表示)

参数 2:-l <length>(长度限制)

作用:仅读取指定长度的字节。
比喻:像用尺子量取一段特定长度的布料,截取数据的“片段”。
示例:

xxd -l 4 test.txt  # 仅读取前 4 字节

参数 3:-c <columns>(列宽调整)

作用:控制每行显示多少字节(默认 16)。
比喻:调整表格的列数,让数据更紧凑或更易阅读。
示例:

xxd -c 8 test.txt  # 每行显示 8 字节

三、进阶技巧:让 xxd 成为你的数据修复师

3.1 案例 1:修复损坏的文本文件

假设文件 data.txt 因意外操作导致部分内容损坏,打开后显示乱码。使用 xxd 查看十六进制:

xxd data.txt

发现某行数据异常(例如本应是 48656c6c6f 的“Hello”变成了 48657a6c6f)。通过编辑十六进制文本,将 7a 改为 6c,再用 -r 参数还原文件即可修复。

3.2 案例 2:提取二进制文件中的特定数据

假设有一个二进制文件 image.jpg,需要提取其中的 EXIF 信息(通常位于文件开头)。使用:

xxd -s 0 -l 256 image.jpg > exif_header.txt

将前 256 字节保存为文本,方便后续分析。

3.3 案例 3:与 grep 联合使用定位数据

在大型日志文件中查找特定十六进制模式(例如十六进制的 0a 表示换行符):

xxd -p large.log | grep "0a68656c6c6f"  # 查找包含 "hello" 的十六进制序列

四、与其他工具的对比:为什么选择 xxd?

4.1 对比 od 命令

od(Octal Dump)同样是二进制查看工具,但 xxd 在以下场景更具优势:
| 功能 | xxd | od |
|-------------------|----------------------------------|---------------------------------|
| 反向转换 | 支持(-r 参数) | 不支持 |
| 输出格式直观性 | 十六进制与 ASCII 混合显示 | 支持多种进制(八进制、十进制等)|
| 参数灵活性 | 偏移量、列宽等参数更易用 | 需结合更多选项组合 |

比喻xxd 像是一把瑞士军刀,而 od 更像一把多功能扳手——前者在特定场景下操作更直接。


五、常见问题与最佳实践

5.1 问题 1:转换后的内容与预期不符?

原因:可能未正确使用 -p 参数或文件包含不可打印字符。
解决方案

  • 使用 -p 参数时,需确保输入文件仅包含纯十六进制文本。
  • 若需保留空格或换行,可尝试 xxd -r -p 组合。

5.2 问题 2:如何处理超大文件?

技巧

  • 结合 headtail 分割文件:
    xxd large_file.bin | head -n 100 > part1.txt
    
  • 使用 -s-l 参数分段处理,避免内存溢出。

六、总结与展望

通过本文,你已掌握了 Linux xxd 命令 的核心功能、参数用法及实际案例。无论是调试程序、修复文件,还是分析二进制数据,xxd 都能提供直观且灵活的解决方案。

下一步行动建议

  1. 尝试将本机的某个二进制文件(如 .jpg.exe)用 xxd 转换为文本,观察其结构。
  2. 在虚拟环境中故意损坏一个文本文件,再通过 xxd 修复。
  3. 结合 awksed,编写脚本自动化处理十六进制数据。

掌握 xxd,你不仅获得了一个实用工具,更打开了理解底层数据逻辑的新视角。在后续的开发与运维工作中,它将成为你应对复杂场景的可靠伙伴。


(全文约 1800 字)

最新发布