1. 先搞清楚什么时候需要看二进制文件
在 Linux 环境下处理文件时,大部分时候我们都在和文本文件打交道,用 cat、less、vim 这些工具就能直接查看内容。但遇到二进制文件——比如编译后的程序、图片、音频、视频、数据库文件,或者某些特殊格式的文档——直接用文本编辑器打开就会看到一堆乱码。这时候就需要专门的二进制查看工具。
xxd 和 hexdump 就是两个最常用的命令行工具,它们能把文件的二进制内容按十六进制、ASCII 等形式展示出来,让你能看到文件底层的真实数据。这类工具不是日常高频命令,但关键时刻能帮你判断文件是否完整、排查格式问题、分析文件头,甚至做简单的数据恢复。
很多人第一次接触二进制查看是因为遇到了“文件损坏”的报错,或者想确认下载的文件是否被篡改。也有开发者在调试时需要查看内存 dump 或网络包原始数据。如果你有这些需求,那么掌握 xxd 和 hexdump 的基本用法会很有帮助。
2. xxd 和 hexdump 到底有什么区别
虽然都能查看二进制,但 xxd 和 hexdump 在设计初衷和输出风格上有些差异。
xxd 默认输出比较简洁,左边是地址偏移量,中间是十六进制数据,右边是对应的 ASCII 字符(不可打印字符显示为点号)。它还有一个很方便的功能:能把十六进制输出反向转换回二进制文件。这个特性在手动修改某些二进制数据时特别有用。
hexdump 的输出格式更灵活,支持多种显示格式(十六进制、八进制、十进制等),可以通过格式字符串自定义显示方式。它更适合需要按特定格式解析二进制数据的场景,比如分析协议包或特定文件结构。
从可用性来说,xxd 通常是 vim 软件包的一部分,大多数 Linux 发行版默认安装;hexdump 属于 util-linux 包,也广泛预装。如果系统里两个命令都有,我建议先掌握 xxd,因为它的默认输出对新手更友好,基本功能也覆盖了大部分日常需求。
3. 从最简单的文件查看开始
先准备一个测试文件。创建一个包含简单文本的文件:
echo "Hello Binary World" > test.txt然后用 xxd 查看:
xxd test.txt你会看到类似这样的输出:
00000000: 4865 6c6c 6f20 4269 6e61 7279 2057 6f72 Hello Binary Wor 00000010: 6c64 0a ld.我来解释一下这个输出的结构:
00000000:是偏移地址,表示这行数据在文件中的起始位置(十六进制)4865 6c6c 6f20是文件的十六进制内容,每两个十六进制数表示一个字节Hello Binary Wor是右侧的 ASCII 表示,不可打印字符会显示为点号
注意最后一行显示6c64 0a,对应的 ASCII 是 "ld.",其实是因为换行符0a是不可打印字符,所以显示为点号。这就是二进制查看工具的价值——能看到文本工具隐藏的细节。
用 hexdump 查看同一个文件:
hexdump test.txt默认输出略有不同:
0000000 6548 6c6c 206f 6942 616e 7972 5720 726f 0000010 6c64 000a 0000013hexdump 默认按双字节(16位)分组显示,而且字节顺序是反的(小端序),所以 "Hello" 的 "He" 显示为6548而不是4865。这种显示方式在某些特定场景下有用,但日常查看可能不如 xxd 直观。
4. 调整显示格式适应不同需求
4.1 xxd 的常用参数
限制显示长度:如果文件很大,只想看前几行:
xxd -l 256 test.txt # 只显示前256字节调整每行显示的字节数:默认每行16字节,可以改为其他值:
xxd -c 8 test.txt # 每行显示8字节只显示十六进制部分:不需要ASCII显示时:
xxd -p test.txt # 连续显示,不分行从指定偏移开始:跳过文件开头部分:
xxd -s 10 test.txt # 从第10字节开始显示4.2 hexdump 的格式控制
hexdump 的强大之处在于格式控制,但语法相对复杂。先看几个实用例子:
像 xxd 一样显示:
hexdump -C test.txt-C参数是最常用的,它显示标准格式:左边偏移量,中间十六进制,右边ASCII。
自定义显示格式:比如想用十进制显示:
echo -e "\x01\x02\x03" | hexdump -d只查看文件头:分析文件格式时经常需要:
hexdump -C image.jpg | head -20 # 查看JPEG文件头5. 实际应用场景和技巧
5.1 判断文件类型
Linux 的file命令其实也是通过读取文件头信息来判断类型的。我们可以手动验证:
# 创建一个PNG图片的测试文件(包含PNG文件头) echo -ne '\x89PNG\r\n\x1a\n' > test.png xxd test.png | head -2你会看到标准的 PNG 文件头:89 50 4e 47 0d 0a 1a 0a
5.2 检查文件是否损坏
下载大文件后,可以用二进制查看工具检查文件头和尾是否完整:
# 检查文件头 xxd huge_file.zip | head -5 # 检查文件尾 xxd huge_file.zip | tail -5对于 ZIP 文件,文件尾应该有明确的结束标记。如果文件尾异常,可能意味着下载不完整。
5.3 分析文本文件编码
遇到乱码文本时,用 xxd 查看能发现编码问题:
echo "中文" | iconv -f UTF-8 -t GBK > gbk.txt xxd gbk.txt可以看到 GBK 编码的中文与 UTF-8 的字节序列完全不同。
5.4 手动修改二进制数据
xxd 的逆向功能很实用:
# 先导出为十六进制文本 xxd original.bin > hex.txt # 用文本编辑器修改hex.txt vim hex.txt # 转换回二进制 xxd -r hex.txt > modified.bin这种方法适合小范围修改,比如修改文件中的某个标志位或字符串。
6. 处理大文件的正确姿势
二进制文件往往很大,直接xxd huge_file.bin可能会卡住终端。有几种更安全的方式:
只查看关键部分:
# 查看文件头1KB xxd -l 1024 huge_file.bin # 查看特定偏移附近的内容 xxd -s 0x1000 -l 512 huge_file.bin # 从0x1000偏移看512字节结合 less 浏览:
xxd huge_file.bin | less这样可以上下滚动查看,不会一次性输出全部内容。
搜索特定模式:
xxd huge_file.bin | grep "4d 54" # 搜索十六进制模式 xxd huge_file.bin | grep "MT" # 搜索ASCII文本7. 常见问题排查
7.1 命令找不到
如果xxd找不到,通常需要安装 vim:
# Ubuntu/Debian sudo apt install vim-common # CentOS/RHEL sudo yum install vim-commonhexdump找不到时:
# Ubuntu/Debian sudo apt install bsdmainutils # CentOS/RHEL sudo yum install util-linux-ng7.2 权限问题
查看系统文件或他人文件时可能权限不足:
sudo xxd /etc/shadow | head -10 # 需要root权限7.3 二进制显示与预期不符
特别是 hexdump 的字节序问题需要注意。如果发现十六进制显示的顺序奇怪,先确认是不是小端序显示。对于网络协议或文件格式分析,通常需要大端序显示,可以用-C参数避免混淆。
7.4 特殊字符处理
二进制文件中经常包含控制字符(如00字节)。xxd 会将这些显示为点号,这是正常现象。如果确实需要查看所有字符的十六进制值,可以用-p参数获得纯十六进制输出。
8. 进阶用法和替代工具
8.1 结合其他工具进行分析
二进制查看经常需要和其他工具配合:
# 查看进程内存 cat /proc/1234/mem | xxd | head -20 # 分析网络包(需要root) tcpdump -i eth0 -w packet.pcap xxd packet.pcap | head -308.2 od 命令
除了 xxd 和 hexdump,还有一个更古老的 od(octal dump)命令:
od -x test.txt # 十六进制显示 od -c test.txt # 字符显示od 的显示格式比较独特,在某些系统脚本中还在使用。
8.3 图形化工具
对于复杂的二进制分析,图形化工具可能更高效:
- bless:Linux 下的十六进制编辑器
- ghex:GNOME 环境的十六进制编辑器
- hexedit:终端下的简单十六进制编辑器
但对于快速查看和简单分析,命令行工具仍然是最方便的选择。
9. 实际工作中的应用经验
从我多年的使用经验来看,二进制查看工具最重要的不是记住所有参数,而是知道在什么场景下该用什么方式查看。
排查文件问题时:先看文件头确认文件类型和完整性,再看文件尾检查是否完整,最后根据需要查看中间特定位置。
分析数据格式时:结合文档说明,查看特定偏移的数据结构。比如分析图片EXIF信息时,需要先找到EXIF标记,然后按结构逐字段查看。
调试程序时:如果程序输出二进制数据,可以重定向到文件后用 xxd 查看,比直接看乱码容易分析得多。
安全分析时:检查可疑文件的魔数签名,分析恶意软件的文件结构,或者验证数字签名区域的原始数据。
我个人的习惯是:日常快速查看用xxd -l 长度 文件名,需要详细分析时用hexdump -C 文件名 | less,需要修改二进制数据时才用 xxd 的导出编辑再导入流程。
最重要的是,不要一遇到二进制文件就盲目用这些工具从头看到尾。先明确你要解决什么问题,然后有针对性地查看相关部分。大文件直接全量查看既浪费时间又可能卡住终端。先小范围取样,确认找到目标数据后再扩大查看范围,这是最稳妥的工作流程。