Linux xxd 命令(建议收藏)

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 十六进制值,65e6cl,依此类推。
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........

✅ 注释说明:
ffd8ffe0 是 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 字节。


常见问题与注意事项

  1. 文件过大怎么办?
    使用 -l 限制读取字节数,避免输出过多信息。

  2. 十六进制数据格式错误?
    确保输入是合法的十六进制字符串(0–9, a–f, A–F),且为偶数个字符。

  3. 输出乱码?
    使用 -p 参数时,输入必须是连续的十六进制,不能有空格或换行。

  4. 如何查看某个字节的值?
    xxd -c 1,每行只显示 1 字节,便于精准定位。


总结:为什么你应该掌握 Linux xxd 命令?

Linux xxd 命令 是一个看似简单却功能强大的工具。它让你能“看见”二进制数据的真面目,是系统管理员、开发者、安全工程师的必备技能。

无论是调试程序、修复文件、分析网络流量,还是学习计算机底层原理,xxd 都能提供关键线索。它不依赖图形界面,运行在终端中,效率高、可靠性强。

掌握它,就像拥有了一个“数据显微镜”,能帮你深入理解文件的内部结构,提升问题排查能力。

下一次当你遇到“文件打不开”“数据异常”“协议不匹配”等问题时,不妨试试 xxd —— 它或许就是你找到答案的钥匙。