Linux xxd 命令(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 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:如何处理超大文件?
技巧:
- 结合
head
或tail
分割文件:xxd large_file.bin | head -n 100 > part1.txt
- 使用
-s
和-l
参数分段处理,避免内存溢出。
六、总结与展望
通过本文,你已掌握了 Linux xxd 命令 的核心功能、参数用法及实际案例。无论是调试程序、修复文件,还是分析二进制数据,xxd 都能提供直观且灵活的解决方案。
下一步行动建议:
- 尝试将本机的某个二进制文件(如
.jpg
或.exe
)用 xxd 转换为文本,观察其结构。 - 在虚拟环境中故意损坏一个文本文件,再通过 xxd 修复。
- 结合
awk
或sed
,编写脚本自动化处理十六进制数据。
掌握 xxd,你不仅获得了一个实用工具,更打开了理解底层数据逻辑的新视角。在后续的开发与运维工作中,它将成为你应对复杂场景的可靠伙伴。
(全文约 1800 字)