在日常开发工作中,我们经常需要查看二进制文件的内容,比如分析程序的可执行文件、调试网络数据包、检查文件格式等。直接使用文本编辑器打开二进制文件会显示乱码,这时候就需要专门的二进制查看工具。本文将详细介绍 Linux 系统中两个强大的二进制查看命令:xxd 和 hexdump,通过实际示例展示它们的各种用法和适用场景。
无论你是系统管理员、安全研究员还是嵌入式开发者,掌握这些工具都能让你更深入地理解文件结构和数据存储方式。本文将涵盖从基础用法到高级技巧的完整内容,帮助你在实际工作中快速定位问题。
1. 二进制文件查看基础概念
1.1 什么是二进制文件
二进制文件是以二进制格式存储数据的文件,与文本文件相对。文本文件只包含可打印字符(字母、数字、标点等),而二进制文件可以包含任何字节值(0-255)。常见的二进制文件包括可执行程序、图像、音频、视频、数据库文件等。
1.2 为什么需要查看二进制文件
查看二进制文件的主要目的包括:
- 调试程序:分析可执行文件的代码段和数据段
- 文件格式分析:了解特定文件格式的结构
- 数据恢复:从损坏的文件中提取有用信息
- 安全分析:检测恶意代码或分析网络数据包
- 嵌入式开发:查看固件或内存映像
1.3 十六进制表示法的优势
二进制查看工具通常以十六进制格式显示文件内容,这是因为:
- 十六进制比二进制更紧凑:一个字节只需两个十六进制数字表示
- 便于与ASCII对照:每行可以同时显示十六进制和对应的ASCII字符
- 行业标准:调试器、反汇编器等工具都采用这种表示法
2. xxd 命令详解
2.1 xxd 命令基本介绍
xxd 是一个功能强大的十六进制转储工具,可以将文件内容以十六进制格式显示,同时也支持将十六进制转储还原为二进制文件。它是 vim 编辑器的一部分,在大多数 Linux 发行版中默认安装。
2.2 基本使用方法
最简单的用法是直接查看文件内容:
# 查看文件的十六进制内容 xxd filename # 示例:查看 /bin/ls 的前几行 xxd /bin/ls | head -5输出格式通常包含三列:偏移量、十六进制数据和ASCII字符。偏移量表示当前行在文件中的起始位置(以字节为单位)。
2.3 常用选项详解
2.3.1 显示控制选项
# 每行显示指定字节数(默认16字节) xxd -c 8 filename # 每行显示8字节 xxd -c 32 filename # 每行显示32字节 # 从指定偏移量开始显示 xxd -s 100 filename # 从第100字节开始 xxd -s +100 filename # 跳过前100字节 xxd -s -100 filename # 显示最后100字节 # 限制显示长度 xxd -l 64 filename # 只显示前64字节2.3.2 格式控制选项
# 分组显示(默认每组2字节) xxd -g 1 filename # 每组1字节 xxd -g 4 filename # 每组4字节 xxd -g 8 filename # 每组8字节 # 大写字母显示 xxd -u filename # 二进制格式显示(很少使用) xxd -b filename2.3.3 特殊用途选项
# 生成C语言数组格式 xxd -i filename # 示例:生成C数组 echo "hello" > test.txt xxd -i test.txt输出结果:
unsigned char test_txt[] = { 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x0a }; unsigned int test_txt_len = 6;2.4 反向操作:从十六进制转储恢复文件
xxd 的一个重要特性是能够将十六进制转储还原为原始文件:
# 生成十六进制转储 xxd original_file > hex_dump.txt # 从转储文件恢复原始文件 xxd -r hex_dump.txt recovered_file # 验证文件一致性 diff original_file recovered_file3. hexdump 命令详解
3.1 hexdump 命令概述
hexdump 是另一个常用的二进制文件查看工具,比 xxd 功能更丰富,支持多种输出格式和自定义显示方式。它属于 util-linux 软件包,在大多数 Linux 系统中默认安装。
3.2 基本使用方法
# 基本用法 hexdump filename # 规范格式显示(最常用) hexdump -C filename-C 选项(规范格式)会同时显示:
- 偏移地址(十六进制)
- 十六进制字节(每行16字节)
- ASCII字符表示
3.3 常用选项详解
3.3.1 显示控制选项
# 限制显示长度 hexdump -n 100 filename # 显示前100字节 hexdump -n 100 -s 50 filename # 从50字节开始显示100字节 # 跳过指定字节数 hexdump -s 100 filename # 跳过前100字节3.3.2 输出格式选项
hexdump 支持多种数字格式显示:
# 不同进制显示 hexdump -b filename # 八进制(单字节) hexdump -c filename # 字符格式 hexdump -d filename # 十进制(双字节) hexdump -o filename # 八进制(双字节) hexdump -x filename # 十六进制(双字节)3.4 高级格式控制
hexdump 最强大的功能是通过 -e 选项自定义输出格式:
# 自定义格式示例 hexdump -e '16/1 "%02x " " |"' -e '16/1 "%_p" "\n"' filename # 解释: # 16/1 "%02x " - 每字节以十六进制显示,共16字节 # " |" - 分隔符 # 16/1 "%_p" - 每字节以字符显示(不可打印字符显示为点) # "\n" - 换行更复杂的格式示例:
# 显示偏移量+十六进制+ASCII hexdump -e '"%07.7_ax " 8/1 "%02x " " " 8/1 "%02x " " |"' -e '16/1 "%_p" "\n"' filename4. 实际应用案例
4.1 分析可执行文件
# 查看ELF文件头 xxd -l 64 /bin/ls hexdump -C -n 64 /bin/ls通过分析输出,可以识别ELF魔数(7f 45 4c 46)、文件类型(ELF32/ELF64)等信息。
4.2 检查文件类型签名
很多文件格式有特定的魔数(magic number):
# 查看PNG图片文件头 echo -e "\x89PNG\r\n\x1a\n" > test.png xxd -l 8 test.png # 查看PDF文件头 echo "%PDF-1.5" > test.pdf xxd -l 8 test.pdf4.3 分析网络数据包
# 保存网络数据包并分析 tcpdump -c 1 -w packet.pcap xxd packet.pcap | head -204.4 调试嵌入式系统数据
# 查看固件文件 xxd firmware.bin | grep -A5 -B5 "特定模式" # 分析传感器数据 hexdump -C sensor_data.bin5. VIM 与 xxd 结合使用
5.1 在 VIM 中查看二进制文件
VIM 配合 xxd 可以实现在编辑器中查看和编辑二进制文件:
# 以二进制模式打开文件 vim -b filename # 在VIM中转换为十六进制显示 # 输入命令模式,执行: :%!xxd5.2 编辑二进制文件
在 VIM 的十六进制模式下:
- 直接修改十六进制数值
- 修改ASCII字符部分
- 执行
:%!xxd -r转换回二进制格式 - 保存文件
重要提醒:编辑二进制文件有风险,务必先备份原文件。
5.3 实用技巧
# 在VIM中设置快捷键 # 在 ~/.vimrc 中添加: noremap <F8> :%!xxd<CR> noremap <F9> :%!xxd -r<CR>6. 转义字符与二进制数据
6.1 理解转义字符
在编程中,转义字符用于表示不可打印字符:
// C语言中的转义字符示例 char *newline = "\n"; // 换行符 (0x0a) char *tab = "\t"; // 制表符 (0x09) char *null_byte = "\0"; // 空字符 (0x00)6.2 十六进制和八进制转义
// 十六进制转义 char *str1 = "\x48\x65\x6c\x6c\x6f"; // "Hello" // 八进制转义 char *str2 = "\110\145\154\154\157"; // "Hello" // 混合使用 char *complex = "Line1\x0aLine2\x0a"; // 两行文本6.3 在 shell 中创建测试数据
# 使用printf创建包含特定字节的文件 printf '\x48\x65\x6c\x6c\x6f\x0a' > hello.bin xxd hello.bin # 创建包含不可打印字符的文件 printf 'Test\x00Data\xff\xfe' > test.bin hexdump -C test.bin7. 性能比较与选择建议
7.1 xxd 与 hexdump 对比
| 特性 | xxd | hexdump |
|---|---|---|
| 安装来源 | vim 包 | util-linux 包 |
| 反向操作 | 支持 (-r) | 不支持 |
| 格式灵活性 | 一般 | 很强 (-e) |
| 输出美观度 | 较好 | 优秀 (-C) |
| 学习曲线 | 简单 | 中等 |
7.2 使用场景建议
选择 xxd 当:
- 需要将十六进制转储还原为二进制文件
- 生成C语言数组格式的数据
- 简单的二进制文件查看需求
- 与VIM配合编辑二进制文件
选择 hexdump 当:
- 需要高度自定义的输出格式
- 查看大型文件时要求美观的输出
- 需要多种数字格式显示(八进制、十进制等)
- 进行复杂的二进制数据分析
7.3 性能考虑
对于大文件,两个命令的性能差异不大,但可以通过以下方式优化:
# 只查看文件部分内容(提高速度) xxd -l 4096 large_file.bin hexdump -C -n 4096 large_file.bin # 结合grep快速搜索模式 xxd file.bin | grep "特定模式" hexdump -C file.bin | grep "模式"8. 常见问题与解决方案
8.1 权限问题
# 如果文件不可读 sudo xxd /root/protected_file.bin # 或者改变文件权限 chmod +r filename.bin8.2 文件编码问题
# 检查文件是否包含BOM标记 xxd -l 3 utf8_file.txt # EF BB BF 表示UTF-8 BOM # 查看文本文件的二进制表示 echo "Hello 中文" > test.txt xxd test.txt8.3 大文件处理技巧
# 分页查看 xxd large_file.bin | less # 只查看特定区域(计算偏移量) xxd -s 0x1000 -l 0x100 large_file.bin # 保存感兴趣的部分到新文件 xxd -s 0x1000 -l 0x100 large_file.bin > segment.hex xxd -r segment.hex segment.bin8.4 调试脚本示例
#!/bin/bash # 二进制文件分析脚本 FILE="$1" OFFSET="${2:-0}" LENGTH="${3:-256}" echo "=== 文件信息 ===" file "$FILE" echo "大小: $(stat -c%s "$FILE") 字节" echo echo "=== 十六进制查看 (偏移: $OFFSET, 长度: $LENGTH) ===" xxd -s "$OFFSET" -l "$LENGTH" "$FILE" echo echo "=== ASCII 字符串 ===" strings -n 4 "$FILE" | head -209. 高级技巧与最佳实践
9.1 自动化分析脚本
#!/bin/bash # 高级二进制文件分析工具 analyze_binary() { local file=$1 echo "=== 基本文件信息 ===" file "$file" ls -lh "$file" echo echo "=== 文件头分析 ===" xxd -l 64 "$file" echo echo "=== 字符串提取 ===" strings -n 8 "$file" | head -30 echo echo "=== 熵分析 (检测加密/压缩) ===" ent "$file" 2>/dev/null || echo "安装ent工具进行熵分析" } # 使用示例 analyze_binary "$1"9.2 结合其他工具使用
# 结合od命令(八进制转储) od -x filename # 十六进制输出 od -c filename # 字符输出 # 结合file命令识别文件类型 file unknown_file.bin # 结合strings提取可读文本 strings binary_file | grep -i "keyword" # 结合binutils工具集 objdump -h executable_file # 查看段信息 readelf -h executable_file # ELF文件头信息9.3 安全注意事项
- 备份原文件:编辑二进制文件前务必备份
- 权限管理:不要随意修改系统二进制文件
- 病毒扫描:分析未知文件前进行安全扫描
- 法律合规:只分析自己有权限访问的文件
9.4 生产环境使用建议
# 在脚本中使用xxd进行数据验证 validate_file() { local file=$1 local expected_checksum=$2 actual_checksum=$(xxd "$file" | md5sum | cut -d' ' -f1) if [ "$actual_checksum" = "$expected_checksum" ]; then echo "文件验证成功" return 0 else echo "文件验证失败" return 1 fi } # 二进制数据提取函数 extract_binary_section() { local input_file=$1 local output_file=$2 local start_offset=$3 local length=$4 xxd -s "$start_offset" -l "$length" "$input_file" > temp.hex xxd -r temp.hex "$output_file" rm temp.hex }通过系统学习 xxd 和 hexdump 的使用方法,你可以在日常工作中更有效地分析二进制文件,快速定位问题。这些工具虽然简单,但在调试、逆向工程、数据恢复等场景中发挥着重要作用。