文本转十六进制是怎么算的:从 A=0x41 到中文三字节
讲清楚文本转十六进制到底转的是什么,UTF-8 字节如何决定每个字符的 Hex,中文为何是三字节,emoji 为何四字节,以及调试看字节和颜色值这些真实用途。
文本转十六进制是怎么算的:从 A 到中文三字节
我第一次认真盯着 hex 看,是在排查一个接口返回乱码的下午。日志里两段看着一样的中文,字节一对就发现长度差了一截,bug 当场现形。从那以后,我习惯把不确定的字符串先转成十六进制看一眼:Hex 不会骗人,它就是机器真正存的那串字节。
文本转十六进制,转的到底是什么
很多人以为"文本转十六进制"是把字母换成某个神秘编号,其实没那么玄。计算机里没有"字符",只有字节,每个字节是 0 到 255 之间的一个数。十六进制只是把这个数写得更短:两位 Hex 正好表示一个字节,从 00 到 ff。
字母 A 在 ASCII 里是十进制 65,写成十六进制就是 0x41。B 是 42,小写 a 是 61,空格是 20,数字 0 是 30。所以把一句英文转 Hex,本质就是逐个字符查它的字节值,再用两位十六进制写下来。
来个最小的例子。输入 Hi,输出是:
48 69
H 是 0x48,i 是 0x69,两个字符、两个字节,一一对应。你可以用 /zh/t/text-to-hex/ 自己敲一遍,选空格分隔,结果就是这两组。
UTF-8 才是真正的规则
英文好说,一个字符一个字节。问题出在超出纯英文的那一刻。
现在的文本几乎都按 UTF-8 编码存储和传输。UTF-8 是变长的:基本拉丁字符占一个字节,值跟 ASCII 一样;带音符的字符,比如 é,占两个字节,c3 a9;汉字和大多数 CJK 字符占三个字节;emoji 通常占四个字节。
正确的工具会把每个字符走一遍 UTF-8 编码,算出真实字节。偷懒的工具直接读 JavaScript 的 charCodeAt,拿到的是 Unicode 码位,不是字节流。这两者对英文恰好相等,对中文就差出十万八千里,后面细说。
中文为什么是三个字节
挑一个汉字看清楚。"中"这个字,UTF-8 编码是:
e4 b8 ad
三个字节。两个汉字"你好"就是:
e4 bd a0 e5 a5 bd
六个字节,每个字三个。这正是任何一台服务器、一个数据库字段、一个 UTF-8 文件里真正存的内容。
如果某个工具告诉你"中"是 4e2d,那是它读了 charCodeAt 给的 Unicode 码位 U+4E2D,没有任何字节流里会真的出现这串。判断一个文本转十六进制工具靠不靠谱,最快的办法就是丢一个汉字进去:出来三个字节算对,出来两个字节(像 4e2d)就是错的。emoji 同理,😀 是 f0 9f 98 80,一个码位摊成四个字节,这也是为什么粗暴的截断代码常常把一个 emoji 劈成两半。
Hex 和二进制是同一件事的两种写法
十六进制和二进制描述的是同一串字节,只是进制不同。一个字节有 8 个二进制位,正好对应两位十六进制:每四个二进制位(一个半字节)对应一位 Hex。
还是字母 A。它的字节值十进制 65,二进制是 01000001,十六进制是 41。把二进制从中间切开,0100 是 4,0001 是 1,拼起来就是 41。所以 Hex 可以理解成"二进制的速记":同样的信息,二进制写八位,Hex 只写两位,人眼读起来轻松得多。需要逐位看二进制的时候,可以用 /zh/t/text-to-binary/ 把同一段文本转成二进制对照,两边的字节边界完全一致。
顺带说一句颜色。网页里的颜色值 #ff0000 就是三个字节的十六进制:ff 是红、00 是绿、00 是蓝,每个通道一个字节、两位 Hex。理解了文本转十六进制的"两位一字节",看颜色码、看内存地址、看任何十六进制转储,逻辑都是一样的。
这东西平时拿来干嘛
我自己最常用的是三个场景。
一是调协议、读抓包。盯着一段 48 65 6c 6c 6f,切到解码模式粘进去,读出 "Hello",不用在脑子里查 ASCII 表。反过来要发什么内容,打出来选好分隔符,字节直接喂给测试桩。
二是写字节字面量。要把 Hi 写进 C 或 Python 字符串,用 \x 分隔编码得到 \x48\x69,或者切 0x 凑成 0x48, 0x69 这样的初始化列表,大小写还能对上项目的代码风格。
三是验证编码 bug。表单把中文名字重复编码了,粘进"中文"看到 e4 b8 ad e6 96 87,拿它跟接口返回的对一下,差一个字节立刻看得见。
要注意的坑也就两条:别按字符码算(会把中文给成 4e2d),别假设所有 hex 都是 UTF-8(从 Latin-1 或 UTF-16 来的字节边界对不上,会解错)。还有奇数位的 hex 一定是掉了一位,比如 09 打成了 9。
如果你处理的不是文本而是任意二进制数据,想要更紧凑的文本形式,可以换 /zh/t/base64-encoder/:同样把字节变成文本,但三字节换四个字符,比 Hex 省地方,只是不方便逐字节读。两个工具配合用,调试和传输各取所需。
Made by Toolora · Updated 2026-06-13