跳到主要内容

十六进制转储(hex dump)怎么读:偏移量、十六进制、ASCII 三栏看懂二进制

把数据按字节排成偏移量、十六进制、ASCII 三栏,就是 hex dump。这篇讲怎么读这三栏,怎么靠它查文件头和魔数、调试编码问题、做逆向,跟 hexdump 命令一致。

发布于 作者 李雷
#十六进制转储 #hex dump #调试 #逆向 #编码

十六进制转储怎么读:偏移量、十六进制、ASCII 三栏看懂二进制

文本在屏幕上看着是一个样,存到磁盘、走过套接字、进了缓冲区,它其实是一串字节。十六进制转储(hex dump)做的就是把这串字节摊开给你看:左边一栏告诉你每行从第几个字节开始,中间一栏把字节按两位十六进制排出来,右边一栏给你一个 ASCII 预览。三栏一对齐,一段看不见摸不着的二进制就变成了能逐字节核对的东西。

三栏分别是什么

第一栏是偏移量(offset),一个 8 位的十六进制地址,数的是这一行前面有多少字节。第一行从 00000000 起,按每行 16 字节算,下一行就到 00000010,再下一行 00000020。注意它是十六进制,00000010 是第 16 个字节,不是第 10 个。

中间一栏是原始字节,每个字节两位十六进制,空格分组方便你数。右边一栏是 ASCII 预览:0x200x7e(空格到波浪号)之间的字节按它自己的字符显示,其余的,控制字符、换行、多字节序列的每一段,全收成一个点。点只是占位符,不代表那个字节是句号(句号是 2e),具体值得回中间那栏看。

一段文本的真实转储

Hello 这五个字母举例,每行设 16 字节,转储是这样:

00000000  48 65 6c 6c 6f                                    |Hello|

偏移量 00000000 表示从头开始,48 65 6c 6c 6f 正是 H、e、l、l、o 五个 ASCII 字节,右栏 |Hello| 把它们拼回可读形式。再看一个混了汉字的:中A

00000000  e4 b8 ad 41                                       |...A|

一个汉字「中」按 UTF-8 编码占三个字节 e4 b8 ad,字母 A 占一个字节 41。ASCII 栏里「中」的三个续接字节都成了点,只有 A 露脸。这就是为什么字符串「看着两个字」却是四个字节,缓冲区和文件长度认的是后者。

靠它查文件头和魔数

很多二进制格式靠开头几个字节自报家门,这几个字节叫魔数(magic number)。PNG 文件头是 89 50 4e 47 0d 0a 1a 0a,中间 50 4e 47 在 ASCII 栏直接显示成 PNG;PDF 开头是 25 50 44 46,也就是 %PDF;ZIP 是 50 4b 03 04,即 PK。把文件头那几行转储出来,偏移量 00000000 这一行的前几个字节一对,格式真假立判,比看扩展名靠谱得多,因为扩展名能改,文件头改不了那么轻松。

调试和逆向时它救场

我自己排编码问题时几乎离不开它。有次一个配置值死活匹配不上,渲染出来跟标准值一模一样,肉眼看不出差别。倒成 hex dump 才发现里头混了个不换行空格:普通空格是 20,不换行空格是 c2 a0,还有藏在最前面的 BOM ef bb bf。这些东西在文本里隐身,在十六进制栏里一个都跑不掉。逆向时也是同理,你拿到一段不认识的二进制,先转储看偏移量结构、看哪几段是可读字符串、看魔数,往往比直接啃汇编先有方向。

跟 hexdump 命令是一回事

终端里 hexdump -Cxxd 打印的就是这套三栏:8 位偏移量、空格分组的十六进制、竖线括起来的 ASCII。区别只在数据来源,命令行工具转储的是一个文件,在线工具转储的是你粘进来文本的 UTF-8 字节,对同样内容字节逐个相同。把每行设成 16 字节就还原了经典默认排版。手头没终端、或者想把一份转储当链接发给同事,在浏览器里 打开 hex dump 查看器 粘进文本就能拿到一样的输出。如果你更关心从文本反向生成纯十六进制串,而不是这种三栏视图,可以换用 文本转十六进制工具,两者搭配着用排查编码问题最顺手。

读懂这三栏不需要背什么,记住偏移量是十六进制地址、中间是真实字节、右边的点只是占位符,剩下的就是多看几份转储。下次遇到「看着对其实不对」的字符串,别盯着渲染结果猜,倒成字节,答案就在那栏十六进制里。


Made by Toolora · Updated 2026-06-13