hexdump 默认按双字节解释导致错位,应使用 -C 查看标准十六进制+ASCII双栏;定位用 -s 跳过字节、-n 限制长度;UTF-8 中文在 ASCII 栏显示为点属正常;替代工具推荐 xxd(简洁)或 od(跨平台)。

hexdump 默认输出看不懂?先搞清字节序和格式控制
默认 hexdump file 输出是 16 进制 + ASCII 混排,但每行 16 字节、按双字节(2 bytes)为单位解释成十进制短整数——这不是你想要的“逐字节十六进制”。真正看原始字节,得强制按 byte 解析并指定格式。
- 用
-C最省心:它等价于-v -e '16/1 "%02x " " |" 16/1 "%_p" "|\n"',标准十六进制+ASCII 双栏,小端无关,人眼友好 - 避免只写
hexdump -x:它按 2 字节当一个 short 打印十六进制,会错位(比如文件开头48 65 6c 6c变成6548 6c6c) - 如果要导出纯十六进制字符串(如用于调试协议头),用
xxd -p file | tr -d ' '更可靠,hexdump的-v -e写法太绕且易漏空格
想查某个偏移位置的字节?别翻屏,用跳转参数
大文件里找特定 offset(比如第 2048 字节)时,手动翻页容易漏或数错。hexdump 支持直接定位,但参数名反直觉:-s 是 skip(跳过前 N 字节),不是 seek。
- 查看从第 2048 字节开始的 32 字节:
hexdump -C -s 2048 -n 32 file -
-s后面的数字单位是字节,支持后缀:-s 0x800或-s 2K都合法 - 注意:
-s跳过的字节仍会计入总长度统计,但不显示;若文件不足跳转后长度,不会报错,只输出实际可读部分
中文或 UTF-8 文件显示乱码?ASCII 栏不是 bug,是设计如此
hexdump -C 右侧 ASCII 栏只显示可打印的 ASCII 字符(0x20–0x7e),其余一律用 . 替代。UTF-8 多字节序列(如中文)必然含非 ASCII 字节,所以整块变点——这不代表内容损坏,只是 ASCII 栏的渲染规则。
- 确认是否真有中文:用
file -i file看编码,再用iconv -f utf-8 -t ascii//ignore file测试过滤效果 - 想同时看到 UTF-8 解码结果?
hexdump不干这事。改用xxd -g1 file(保持单字节分组)配合od -tc对照更实用 - 二进制协议分析时,反而要依赖这种“非 ASCII 显示为点”的特性快速定位控制字符(如
00、0a、ff)
替代方案选 xxd 还是 od?看你要不要跨平台兼容
xxd 和 od 都能干类似活,但行为差异影响实操效率:
-
xxd是 Vim 自带工具,语法简洁,-r反向转换(十六进制字符串 → 二进制)比hexdump稳定得多;macOS 和 Linux 通常都有 -
od -t x1更 POSIX 兼容,AIX / Solaris 上更可能预装,但默认按 4 字节对齐,需加-An -w1才接近hexdump -C效果 - 别用
cat file | hexdump管道:丢失原始文件名和部分元信息;除非确定 stdin 是纯二进制流,否则优先给文件路径
真正麻烦的是嵌入式设备或最小化系统里连 hexdump 都没装的情况——这时候 od -Ax -tx1 -tc 是唯一指望,但得记住 -Ax 才显示十六进制地址,少个 x 就变成八进制,查半天发现 offset 对不上。










