在日常开发工作中我们经常需要查看二进制文件的内容比如分析程序的可执行文件、调试网络数据包、检查文件格式等。直接使用文本编辑器打开二进制文件会显示乱码这时候就需要专门的二进制查看工具。本文将详细介绍 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 :%!xxdCR noremap F9 :%!xxd -rCR6. 转义字符与二进制数据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 对比特性xxdhexdump安装来源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 $19.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 的使用方法你可以在日常工作中更有效地分析二进制文件快速定位问题。这些工具虽然简单但在调试、逆向工程、数据恢复等场景中发挥着重要作用。