十六进制查看器

把输入按 hexdump -C 的 canonical 形制逐字节摊开:每行 16 字节、8 位小写十六进制偏移、第 8 字节后多一个分组空格、ASCII 列只印 0x20 到 0x7E,其余显示点。默认输入 Hi 中,共 6 字节,输出一行;「中」是 e4 b8 ad 三个 UTF-8 字节,所以 3 个字符占 6 字节。UTF-8 编码为手写实现,不依赖 TextEncoder。

显示 ASCII 列(右侧 |...|)
默认输入 Hi 中 共 6 字节:H、i、空格各占 1 字节,中占 3 字节(e4 b8 ad),所以一行放得下;偏移量按字节计,第 2 行从 00000010 起。

默认示例:Hi 中。输入框被清空时点「开始转换」会自动填回示例;超过 4096 字节只显示前 4096 字节,并在结果区末尾多出一行截断说明。

使用方法

  1. 输入框默认已经填好 Hi 中,共 6 字节。改任意内容立即重算,光标停在输入框里按 Ctrl+Enter(Mac 上 Cmd+Enter)同样触发;单独的 Enter 留给换行。
  2. 「显示 ASCII 列」默认勾选,对应 hexdump -C 右侧的 |...|;取消勾选后只保留十六进制区,行尾没有竖线,字节区宽度不变。
  3. 「最多显示字节数」默认 4096,范围 1 到 4096。粘贴超长内容时只 dump 前 N 字节,结果区末尾会多出一行截断说明,写明输入总字节数与上限,不静默丢弃。
  4. 结果区第一行是主结果(总字节、总行数、可打印与非打印计数),下面是完整 hexdump 与统计明细,等宽字体显示,可以直接整段复制。
  5. 工具区下方是 16 行字节区间速查表,最后一列是当前输入落在该区间的字节数,默认显示 12 行,点「加载更多」展开余下 4 行,点「导出 CSV」存成带字节序标记的文件。
  6. 「复制结果」复制 hexdump 与统计全文;「复制魔术数表」复制正文里那张常见文件头表,制表符分隔,可直接粘进表格软件。
  7. 每行固定 16 字节:N 字节的行数是 N ÷ 16 向上取整,16 字节 1 行、17 字节 2 行、256 字节 16 行;最后一行不足 16 字节时用空格补齐,ASCII 列只印实际存在的字节。
  8. 输入框被清空时点「开始转换」会自动填回示例;本页不解析文件、不识别编码,只把框里的字符按 UTF-8 变成字节。

这个十六进制查看器能解决什么问题

排查数据时最常听到的一句话是「你这文件头不对」。文件头是二进制,肉眼只能看个轮廓;十六进制查看器把每个字节摊成两字符一组的十六进制,再配一列 ASCII,头四个字节是不是 89 50 4E 47 一眼可辨。本站这一页的名称「十六进制查看器」,做的就是按 hexdump -C 形制把任意文本摊开,偏移、分组、点号全部对齐事实标准。

第一类是核对文本编码。同一个「中」字,GBK 编码是 D6 D0,UTF-8 是 E4 B8 AD,UTF-16 大端是 4E 2D。看到 e4 b8 ad 就知道是 UTF-8;看到两个字节且都落在 80–9F 区间,多半是 Windows-1252 或 Latin-1 的老数据。编码纠纷不用猜,dump 一次就有结论。

第二类是给二进制协议与文件头做人工比对。调试接口返回、校验下载的文件、确认一段 base64 解码后的内容,都可以先粘进来看字节数与头尾。本页按字节不按字符计数,所以「6 个字符」与「6 个字节」的差别会直接显示在统计行里。

第三类是教学与排错。讲 UTF-8 变长编码时,把 Hi 中 与 Hello 中 分别 dump 一次,能看到中文从 1 个字符变成 3 个字节、后续偏移整体后移。手写 UTF-8 编码函数只靠 charCodeAt 与位运算,沙箱与老浏览器里同样跑得动,不依赖 TextEncoder。

计算原理与变量说明

输入先经过手写的 utf8() 函数变成字节数组:码位小于 0x80 的直接 1 字节;小于 0x800 的拆成 2 字节(110xxxxx 10xxxxxx);代理对先合成 0x10000 以上的码位再拆 4 字节;其余落在 U+0800 以上的按 3 字节(1110xxxx 10xxxxxx 10xxxxxx)。所以「中」(U+4E2D)落为 E4 B8 AD,Hello 五个字母各 1 字节。

码位区间字节数引导字节延续字节例
U+0000 – U+007F1——A = 41
U+0080 – U+07FF2C2–DF80–BFé = C3 A9
U+0800 – U+FFFF3E0–EF80–BF中 = E4 B8 AD
U+10000 – U+10FFFF4F0–F480–BF😀 = F0 9F 98 80

按字节不按字符。UTF-8 是变长编码:ASCII 1 字节、中文与日文 3 字节、emoji 4 字节。所以「6 个字符」在内存里是 6 个字节这件事只对纯英文成立;Hi 中 是 3 个字符却占 6 字节。字符串的 length 属性数的是 UTF-16 码元,一个 emoji 在其中算 2,与字节数又差一层,这也是本页统计行单独给出字节数的原因。

偏移量是字节偏移,不是字符偏移。第 1 行覆盖字节 0 到 15,偏移写作 00000000;第 2 行从 00000010 开始,这个 10 是十六进制,等于十进制 16,是最容易看错的地方。第 3 行是 00000020(十进制 32),偏移位数固定 8 位小写,不足补零,不随字节总数变化。

hexdump -C 的 -C 是 canonical 形制。8 位小写十六进制偏移、两个空格、16 个字节各两位小写十六进制、第 8 字节之后多一个空格把字节区分成两组、然后是 | + ASCII 列 + |,ASCII 列只印 0x20 到 0x7E,其余显示点。这是事实标准;xxd 默认偏移后面是冒号、字节按 2 个一组四个十六进制排,形制不同,不要两种输出直接对比。

ASCII 列里的三个点是正常的。e4、b8、ad 三个字节都落在 0x80–0xBF 的延续区,不在可打印区间内,所以各显示一个点;这不是乱码,是 UTF-8 多字节字符的固有表现。文件头魔术数(89 50 4E 47 = PNG、FF D8 FF = JPEG、25 50 44 46 = %PDF)是二进制排障的入口,下方对照表列了 16 种常见文件头。

完整示例(数值仅作演示)

默认一组:输入 Hi 中、ASCII 列开启、上限 4096。输出一行 00000000 48 69 20 e4 b8 ad |Hi ...|,统计为总字节 6、总行 1、可打印 3(H、i、空格)、非打印 3(e4、b8、ad)。

对照一组:输入 Hello 中 得 9 字节,仍是 1 行,第 8 字节 b8 之后出现分组用的双空格;输入 17 个字符 abcdefghijklmnopq 得 2 行,第 2 行偏移 00000010,只含字节 71 一个。两组都能用页面自己的 utf8() 与行数公式复算。

边界一组:输入 中 得 3 字节 1 行,ASCII 列是三个点;输入 emoji 😀 得 4 字节 1 行,十六进制为 f0 9f 98 80;把上限改成 2,Hi 中 只显示前 2 字节(48 69),结果区末尾多一行截断说明。

文件头魔术数与字节区间对照表

下表列出常见文件的前几个字节。二进制排障的第一步就是把文件头 dump 出来对这张表:对得上是什么格式,对不上就说明文件损坏或被截断。「复制魔术数表」按钮复制的就是这张表。

格式魔术数字节(十六进制)ASCII 预览说明
PNG89 50 4E 47 0D 0A 1A 0A.PNG....8 字节定长,含 CR LF 与两个 1A
JPEGFF D8 FF...SOI 标记,后跟 E0/DB 等段标记
GIF47 49 46 38GIF8第 5 字节区分 87a 与 89a
PDF25 50 44 46%PDF后接版本号如 1.7
ZIP50 4B 03 04PK..PK 后跟 03 04 为本地文件头
GZIP1F 8B 08...RFC 1952,第三字节固定 08
ELF7F 45 4C 46.ELFLinux 可执行文件
Java classCA FE BA BE....咖啡馆组,JVM 识别
SQLite53 51 4C 69 74 65SQLite后接 format 3 与空字节
BMP42 4DBMWindows 位图
MP3(ID3)49 44 33ID3带标签的 MP3;裸帧是 FF FB 或 FF F3
WASM00 61 73 6D.asmWebAssembly 二进制
RAR52 61 72 21 1A 07Rar!..末字节 00 为 RAR4,01 为 RAR5
ICO00 00 01 00....Windows 图标
OLE2(doc/xls/ppt)D0 CF 11 E0 A1 B1 1A E1........旧版 Office 复合文档
WebP52 49 46 46 … 57 45 42 50RIFF..WEBP偏移 0 是 RIFF,偏移 8 才是 WEBP

第二张表把字节按区间归类,工具区里那张速查表的最后一列会实时数出当前输入落在各区间的字节数:00–1F 是控制字符,20–7E 是可打印 ASCII,7F 是 DEL,80–9F 在 Windows-1252 里另有映射而 UTF-8 不会单独出现,A0–BF 是 UTF-8 延续字节,C0–DF 是 2 字节引导,E0–EF 是 3 字节引导(汉字集中在这里),F0–F7 是 4 字节引导,F8 以上在 UTF-8 中是非法字节。

结果边界、舍入与适用说明

常见问题

为什么「中」是三个字节?

「中」的码位是 U+4E2D,落在 U+0800–U+FFFF 区间,UTF-8 用 3 字节编码:E4 B8 AD。首字节 E4 在 E0–EF 引导段,后两字节在 80–BF 延续段,所以 ASCII 列显示三个点。

偏移量 00000010 是十进制几?

十六进制 10 等于十进制 16。每行 16 字节,第 2 行从第 17 个字节开始,偏移写作 00000010;第 3 行是 00000020,即十进制 32。

ASCII 列为什么显示点?

只印 0x20 到 0x7E,其余显示点。e4 b8 ad 都不可打印,所以是三个点;这不是乱码,是 UTF-8 多字节字符的固有表现。

第 8 字节后为什么多一个空格?

hexdump -C 的 canonical 形制把 16 个字节分成两组各 8 个,组间多一个空格,便于肉眼定位第几个字节。取消勾选 ASCII 列时这个分组空格仍然保留。

和 xxd 有什么区别?

xxd 默认偏移后面是冒号、字节按 2 个一组四个十六进制排列;hexdump -C 是每位后一个空格、第 8 字节后多一个分组空格。形制不同,输出不要直接对比。

为什么不用 TextEncoder?

沙箱环境与部分老浏览器没有 TextEncoder。手写的 utf8() 只靠 charCodeAt 与位运算,任何能跑 JavaScript 的地方结果都一致,也不引入额外依赖。

emoji 为什么是 4 字节?

U+1F600 超出 U+FFFF,UTF-16 里是一个代理对,UTF-8 用 4 字节 F0 9F 98 80。页面按码位迭代,代理对不会被拆成两个字符,也不会多算字节数。

输入的数据会上传到服务器吗?

不会。编码、统计与导出都在本页完成,没有发起任何网络请求,刷新页面后输入即恢复默认值。

相关工具