文本转十六进制:字节在跟踪记录里的样子
这个换算在做什么
它把文本按 UTF-8 编码,再把每个字节打印成两位十六进制。这是抓包、内存查看器和协议日志使用的记法,所以这个转换实际上是在你敲进去的内容和工具显示出来的内容之间做翻译。
每字节固定两位
一个字节的取值范围是 0 到 255,而两位十六进制恰好覆盖这个区间——从 00 到 FF。这个配对从不改变,正是它让十六进制转储变得可以扫读:数一下有几对就知道有几个字节,左边的偏移列会告诉你正在看哪一对。八个字符的字符串就是八对,任何字符都不可能只产生半对。
文本转十六进制对照表
短字符串及其十六进制字节值。标点和数字变成长度为一对的 ASCII 值,而拉丁字母表之外的任何内容都会展开成好几对。
| 文本 | 十六进制 |
|---|---|
| A | 41 |
| Hi | 48 69 |
| OK | 4F 4B |
| 123 | 31 32 33 |
| ! | 21 |
| Go | 47 6F |
在抓包里找到一段字符串
在抓包文件里搜可读文本往往搜不到,因为线上跑的是字节,而你敲进去的是字符。把要找的字符串转成十六进制,就得到了精确的搜索序列;它也解释了为什么搜一个带音标的名字会失败,而把音标去掉却成功——两者的编码形式长度不同,而不只是字符不同。
注意分隔符
本工具为了易读用空格分隔字节,而许多抓包记录和网址会把数字连在一起,或者改用百分号。搜索时请去掉空格,或换成你的工具期待的那种分隔符——一段乍看完全相同的序列,可能仅仅因为这些间隙就对不上。
常见问题
怎样手算文本转十六进制?
查出每个字符的 UTF-8 字节值,写成两位十六进制。Hi 就是 48 和 69。对于 ASCII 范围之外的字符,你需要的是字节值而不是码点,因为一个字符可能占好几个字节。
十六进制输出和二进制输出有什么区别?
除了记法没有任何区别。两者编码的是同一串 UTF-8 字节;十六进制把每个字节写成两位,二进制写成八位,所以十六进制短四倍,也更好扫读。要阅读就选十六进制,要看清某一位时再用二进制。
为什么我的带音标字符变成了两个字节?
因为 UTF-8 对最初 ASCII 范围之上的一切都用多于一个字节来编码,多数带音标的拉丁字母占两个。这是正常的,不是损坏——这个字符只是超出了单字节能表示的区间,任何字节计数器看到的都是两个。
这和网址用的编码是一回事吗?
相关但不完全相同。百分号编码会在每一对字节前加一个百分号,所以字节值与本工具完全一致,差别只在标点。在这里转成十六进制,就得到了拿去做百分号编码的正确字节。
输出能直接用在字节数组字面量里吗?
可以。这些数字就是字节值本身,所以给每一对加上 0x 前缀,就得到大多数编程语言里的字面量。工具按惯例输出大写;小写无论粘到哪里都同样合法。