Linux xxd 命令:从零开始掌握十六进制查看与编辑工具
在 Linux 系统中,我们经常需要查看文件的原始内容,尤其是那些包含二进制数据的文件,比如可执行程序、图片、音频、网络数据包等。这些文件的“内容”不是我们日常看到的文本,而是由 0 和 1 组成的机器语言。这时候,xxd 命令就成为了我们最得力的“数据侦探”工具。
Linux xxd 命令 不仅能将文件内容以十六进制形式展示,还能将十六进制数据还原为原始字节,是系统调试、逆向分析、网络抓包、文件修复等场景下的利器。本文将带你一步步掌握它的核心用法,从基础到进阶,无需背景知识也能轻松上手。
什么是 xxd 命令?它能做什么?
xxd 是一个命令行工具,它的名字来源于 “hex dump” 的缩写,即“十六进制转储”。它能将任意文件的内容转换为十六进制格式输出,也可以反过来,将十六进制数据转换回原始字节。
你可以把它想象成一个“翻译器”:
- 输入是原始字节(二进制),输出是十六进制(0x00 ~ 0xFF);
- 或者反过来,输入是十六进制,输出是原始数据。
这个工具在处理非文本文件时特别有用,比如你打开一个 .jpg 文件,用普通编辑器看到的是一堆乱码,但用 xxd 查看,就能看到每一行的十六进制值,从而判断文件头、结构、甚至修复损坏的文件。
基础用法:查看文件的十六进制内容
最简单的用法就是直接对文件使用 xxd 命令。假设我们有一个名为 hello.txt 的文本文件,内容如下:
Hello, world!
运行以下命令:
xxd hello.txt
输出示例:
00000000: 4865 6c6c 6f2c 2077 6f72 6c64 210a Hello, world!.
输出解析:
00000000:这是当前数据的起始地址(偏移量),单位是字节。4865 6c6c 6f2c 2077 6f72 6c64 210a:这是文件内容的十六进制表示。- 最后一列是原始字符的可打印版本(ASCII 显示)。
✅ 注释说明:
48是字母H的 ASCII 十六进制值,65是e,6c是l,依此类推。
21是感叹号!,0a是换行符(LF)。
这种格式便于我们“读懂”二进制数据。
格式自定义:控制输出样式
xxd 默认输出每行 16 字节,但我们可以自定义格式,比如改变每行字节数、偏移量起始值、是否显示可打印字符等。
示例 1:每行显示 8 字节
xxd -c 8 hello.txt
输出:
00000000: 4865 6c6c 6f2c 2077 6f72 6c64 210a
这样每行只显示 8 个字节,适合在小屏幕查看或需要更精细分析时使用。
示例 2:从偏移量 10 开始显示
xxd -s 10 hello.txt
-s 10 表示跳过前 10 个字节,从第 11 个字节开始显示。
这在分析大文件(如日志、数据库)时非常有用,可以快速定位特定区域。
✅ 注释说明:
如果你只想看文件中某个特定部分(比如从第 10 个字符开始),这个选项就能省去手动翻页的麻烦。
从十六进制还原原始数据:反向转换
xxd 不仅能“看”,还能“写”。我们可以通过 xxd -r 将十六进制数据还原为原始字节。
示例:将十六进制写回文件
假设我们有以下十六进制数据:
48656c6c6f2c20776f726c64210a
我们可以用如下命令还原:
echo "48656c6c6f2c20776f726c64210a" | xxd -r -p - output.txt
✅ 注释说明:
echo输出十六进制字符串xxd -r表示反向转换-p表示输入是“纯十六进制”(无空格、无偏移量)-表示从标准输入读取output.txt是输出文件名
执行后,output.txt 就会包含原始内容:Hello, world!
实战案例:分析一个损坏的文本文件
假设你有一个文本文件 corrupted.txt,打开后全是乱码,但你知道它本应是:
This is a test file.
你可以用 xxd 查看它的十六进制内容,判断问题出在哪。
xxd corrupted.txt
输出:
00000000: 5468 6973 2069 7320 6120 7465 7374 2066 This is a test f
00000010: 696c 652e 0a0a 0a0a 0a0a 0a0a 0a0a 0a0a ile.............
发现虽然内容基本正确,但后面多了很多 0a(换行符),可能是编码错误或写入异常。
此时你可以用 xxd -r 提取有效内容,修复文件:
xxd -s 0 -l 20 corrupted.txt | xxd -r -p - fixed.txt
✅ 注释说明:
-s 0从偏移量 0 开始-l 20只读取 20 字节| xxd -r -p -将十六进制转换为原始数据并输出到fixed.txt
修复后,fixed.txt 就是干净的文本内容。
高级技巧:处理二进制文件与网络数据
xxd 在处理非文本文件时特别强大。比如分析一个 .jpg 文件的头信息:
xxd -l 16 image.jpg
输出:
00000000: ffd8 ffe0 0010 4a46 4946 0001 0100 0001 ......JFIF........
✅ 注释说明:
ffd8和ffe0是 JPEG 文件的标准文件头(SOI 和 APP0),说明这是一个合法的 JPEG 文件。
类似地,你可以用 xxd 分析 .mp3、.pdf 等文件,快速判断其格式是否正确。
在网络安全领域,xxd 也常用于分析抓包数据。比如从 tcpdump 导出的数据包中提取原始字节,用 xxd 查看:
tcpdump -s 0 -r capture.pcap -n | xxd -r -p > raw_data.bin
这能帮你分析协议结构或定位异常数据。
常用参数一览表
| 参数 | 作用说明 |
|---|---|
-c N |
每行显示 N 个字节(默认 16) |
-s N |
从偏移量 N 开始读取(单位字节) |
-l N |
限制读取 N 个字节 |
-r |
反向转换:将十六进制转回原始字节 |
-p |
输入为“纯十六进制”(无空格、无偏移量) |
-g N |
每 N 个字节添加一个空格(如 -g 2) |
✅ 注释说明:
这些参数组合使用,能实现非常灵活的数据分析。例如:xxd -c 8 -s 100 -l 32 file.bin表示从第 100 字节开始,读取 32 字节,每行显示 8 字节。
常见问题与注意事项
-
文件过大怎么办?
使用-l限制读取字节数,避免输出过多信息。 -
十六进制数据格式错误?
确保输入是合法的十六进制字符串(0–9, a–f, A–F),且为偶数个字符。 -
输出乱码?
使用-p参数时,输入必须是连续的十六进制,不能有空格或换行。 -
如何查看某个字节的值?
用xxd -c 1,每行只显示 1 字节,便于精准定位。
总结:为什么你应该掌握 Linux xxd 命令?
Linux xxd 命令 是一个看似简单却功能强大的工具。它让你能“看见”二进制数据的真面目,是系统管理员、开发者、安全工程师的必备技能。
无论是调试程序、修复文件、分析网络流量,还是学习计算机底层原理,xxd 都能提供关键线索。它不依赖图形界面,运行在终端中,效率高、可靠性强。
掌握它,就像拥有了一个“数据显微镜”,能帮你深入理解文件的内部结构,提升问题排查能力。
下一次当你遇到“文件打不开”“数据异常”“协议不匹配”等问题时,不妨试试 xxd —— 它或许就是你找到答案的钥匙。