十六进制编码的工作原理
页面上的每个字符都以一个或多个字节存储。十六进制编码将这些字节改写为十六进制(base 16)形式,每字节两个字符,使字节流无需特殊工具即可阅读。
- 将文本编码为字节. UTF-8 模式通过
new TextEncoder().encode(text)对输入进行处理,返回包含字节值的Uint8Array。Latin-1 模式通过charCodeAt(0) & 0xFF取每个代码单元的低八位,与传统 ISO-8859-1 编解码器的处理方式一致。 - 将每字节渲染为两位十六进制数. 每字节通过
byte.toString(16).padStart(2, "0")映射为两位十六进制数字。大小写切换决定输出字母使用大写(A-F)还是小写(a-f)。 - 应用分组与前缀. 分组在字节间插入分隔符:单空格、短横线,或每四字节插入一个空格。0x 前缀可以整体添加到字符串开头(不分组模式),也可以每字节单独添加(空格分组模式),以匹配 C 数组和二进制差异工具所期望的格式约定。
- 反向解码. 十六进制 → 文本模式会去除输入中的所有空格、短横线和
0x前缀,用/^[0-9a-fA-F]+$/验证剩余字符,拒绝奇数位长度的字符串,并从连续字节对重建Uint8Array。UTF-8 模式使用new TextDecoder("utf-8", { fatal: true })解码该数组;Latin-1 模式将每字节映射为String.fromCharCode(b)。 - 实时模式,快速迭代. 实时模式默认开启。每次按键会触发 150 毫秒的防抖重新转换,粘贴、编辑时无需点击转换按钮即可实时看到另一侧的更新。
为何使用十六进制转换器
- 调试二进制协议. Modbus、DNP3、CoAP 等线格式将各字段打包到特定字节偏移量中。以十六进制读取捕获的帧可以一目了然地查看每个字段,将相同字节翻转回 ASCII 则能发现隐藏在二进制帧内的明文载荷。
- 处理嵌入式固件. JTAG 和 SWD 探针以十六进制形式报告内存内容。将某段内存转换为 ASCII,可以发现嵌入的字符串(文件路径、错误消息、厂商签名),通常能精准定位固件中正在查看的位置。
- 读取数据包捕获. Wireshark 和 tcpdump 均提供字节面板,左侧以十六进制打印每个数据包,右侧显示 ASCII。在此处转换片段,可以从错误报告或聊天记录中复制 hex 数据块,直接读取字节的实际含义,无需将其重新导入捕获工具。
- 字节级差异对比. 比较两个二进制文件往往归结为找出哪些字节发生了变化。用统一的分组将两侧都转换为十六进制,可以在文本编辑器中对齐差异,借助内置差异工具高亮显示变化的字节。
常见应用场景
只要字节流不只是纯文本载荷,逆向工程、安全分析和嵌入式开发中都会用到十六进制 ↔ ASCII 转换。
- 逆向工程:从抗 strings 命令的二进制文件中取出 hex 转储,挑选出能解码为可打印 ASCII 的连续段,用这些字符串锚定在反汇编中的位置。
- 网络取证:从 Wireshark 中以十六进制形式复制单个数据包载荷,粘贴到此处,无需导出完整捕获即可读取应用层文本。
- 密钥材料处理:密钥、IV 或 HMAC 标签通常以十六进制字符串形式传递。将其解码回字节可确认长度与算法匹配(AES-128 为 16 字节,AES-256 为 32 字节),然后再写入配置。
操作示例
选择「文本 → 十六进制」、UTF-8、小写、每字节加空格、不加前缀,输入 Hi,输出为 48 69。开启前缀并将分组改为「不分组」,同一输入渲染为 0x4869。输入表情符号 😀,UTF-8 模式渲染为 f0 9f 98 80——一个码点对应四字节,这正是表情符号常常增大传输量的原因。切换到「十六进制 → 文本」,粘贴 0x48-65-6C 6C 6F:解析器去除前缀、短横线和空格后还原出 Hello。
FAQ
什么是十六进制编码?
十六进制编码(hexadecimal encoding)以 base 16 书写字节流,每字节两个 ASCII 字符。每个十六进制位覆盖四位,两位覆盖一个八位字节。字符集为 0-9 再加 A-F(或 a-f),大小写只是展示选择,解码器两者均可接受。十六进制是协议规范、调试器输出和密钥的标准字节书写方式,因为它比二进制紧凑一倍,同时避免了原始字节在文本中的不可打印字符问题。
为什么表情符号在十六进制中变成 4 字节?
UTF-8 是可变长度编码。ASCII 字符(U+0000 至 U+007F)占一字节,Latin-1 补充字符占两字节,BMP 中的大多数其他码点占三字节,U+FFFF 以上的字符(包括大多数表情符号)占四字节。笑脸 😀 为 U+1F600,编码为 F0 9F 98 80。如需固定宽度字节视图,可切换为 Latin-1——但 Latin-1 仅覆盖前 256 个码点,该范围外的任何字符都无法往返转换。
此工具支持 Latin-1 / ISO-8859-1 吗?
支持。将「文本编码」选项切换为 Latin-1 (ISO-8859-1) 即可。编码时取每个 JavaScript 代码单元的低八位(charCodeAt(0) & 0xFF),与旧式单字节映射一致。解码时对每字节使用 String.fromCharCode(byte)。当处理旧式 Windows-1252 或 pre-Unicode 系统的输出、每字节恰好对应一个字符时,请使用 Latin-1。
转换是在浏览器中进行的吗?
是的。此转换器将 TextEncoder、TextDecoder 和一个小型解析器作为单一静态页面运行。无需上传、无 API 调用,您粘贴的内容也不会被用于分析——仅共享全站通用的标准页面加载指标。此处看到的 hex 字节与 Node 脚本或 Lambda 函数对相同输入生成的结果完全一致。
十六进制 ↔ ASCII 转换是一项小而频繁的工作,凡是读取二进制协议或嵌入式固件的工程师每天都会用到几次。在浏览器标签页中完成,借助 Node 和 V8 内置的原生编解码器,既快速又能让字节数据留在本机。