十六进制转储的三段结构
标准十六进制转储按行排列,每行三段:左侧是偏移量,中间是固定字节数的十六进制字节,右侧是这些字节对应的可打印字符,不可打印的用点号代替。默认每行 16 字节,中间常按 8 字节分成两组方便定位。读懂这三段,就能在不打开文件的情况下判断它的类型、长度与结构。
基本信息
| Linux 工具 | xxd(可还原)、hexdump -C(规范格式)、od -A x -t x1z |
|---|---|
| Windows 工具 | PowerShell 的 Format-Hex,输出偏移、字节、Ascii 三列 |
| 每行字节数 | 通常 16,可按需调整;xxd -c 或 hexdump -n 控制 |
| 偏移基准 | xxd 默认十六进制显示偏移,左侧 8 位十六进制数字 |
| 还原方式 | xxd -r 按转储文本还原,纯十六进制可用 xxd -r -p 或脚本解析 |
典型使用场景
- 确认文件真实类型:扩展名被改过时看开头魔数
- 排查二进制协议字段:定位偏移后按位宽读出数值
- 比对两份文件差异,找出第一个不一致的字节偏移
- 修复被截断的数据:确认尾部是否完整、有无填充
- 分析硬件与固件数据,确认字节序与对齐
常用命令与还原
常用命令与还原
xxd file.bin | head -n 4 # 默认转储,左侧为十六进制偏移
hexdump -C file.bin | head # 规范格式,与 xxd 布局接近
od -A x -t x1z file.bin | head # 偏移十六进制、单字节十六进制加可打印字符
xxd -s 0x40 -l 32 file.bin # 只看偏移 0x40 起的 32 字节
xxd file.bin > dump.txt && xxd -r dump.txt file.new # 还原并校验
python3 -c "print(open('file.bin','rb').read(16).hex())" # 纯十六进制串每段怎么读
| 位置 | 内容 | 读法 |
|---|---|---|
| 左侧偏移 | 该行第一个字节在文件中的位置 | 十六进制,按 16 递增;定位字段时以它为准 |
| 中间字节 | 每两个十六进制数字代表一字节 | 数值大小写无关,空格只是分组,不是分隔符 |
| 中间分组 | 常见 8 字节一组 | 地址换算与对齐判断用得上,不影响字节值 |
| 右侧文本 | 字节按单字节字符集的可打印视图 | 点号既可能是真的点号,也可能是不可打印字节 |
| 行尾省略 | 短行表示文件尾部不足一整行 | 截断文件常表现为最后一行字节数异常 |
文件头魔数是识别类型的可靠依据:PDF 以 25 50 44 46 开头,ZIP 以 50 4B 03 04 开头,PNG 以 89 50 4E 47 开头,JPEG 以 FF D8 FF 开头,gzip 以 1F 8B 开头。扩展名与魔数不一致时,以魔数为准。
hexdump 不加 -C 时使用主机默认的字节分组与端序显示,看起来会比实际更混乱;跨平台交流数据时统一使用 hexdump -C 或 xxd 的输出格式,便于他人复现。