如何把 hex 转为文本
- 把 hex 粘贴到 输入 · Hex。大写小写均可,有没有分隔符都行。
- 文本会随输入实时出现在 输出 · 文本 中。如果想按 运行 再转换,取消勾选 实时。
- 如果输出中出现
�,打开输出下方的 字符集,换一个试试。默认是 UTF-8;列表中还有 ASCII、Latin-1、Windows-1252 以及另外 23 种。 - 用 复制输出 或 下载 获取文本。如果 hex 是文件的转储而不是文本,保存字节 会把原始字节写入磁盘,并根据内容猜测扩展名。
工具上方的 文本 → Hex 切换可以反转方向,也可以直接前往 文本转 Hex。
转换器能读取的 hex 格式
不同工具产生的 hex 写法各不相同。下面这些都会解码为 Hello:
| 格式 | 示例 | 常见来源 |
|---|---|---|
| 纯 hex | 48656c6c6f | xxd -p、sha256sum、数据库转储 |
| 空格分隔 | 48 65 6c 6c 6f | Wireshark、十六进制编辑器 |
| 冒号分隔 | 48:65:6c:6c:6f | 证书指纹、openssl 输出 |
| 短横线分隔 | 48-65-6C-6C-6F | .NET BitConverter.ToString |
0x 前缀 | 0x48 0x65 0x6c 0x6c 0x6f 或 0x48656c6c6f | C 源码、调试器 |
\x 转义 | \x48\x65\x6c\x6c\x6f | Python、shell 脚本、日志 |
逗号、分号和句点也可以作为分隔符。只粘贴 hex 列:xxd 的默认视图每行以 00000000: 这样的偏移量开头,以 ASCII 列结尾,转换器会把偏移量当作字节读取,然后在 ASCII 列的第一个字母处报错。请改用 xxd -p 得到纯 hex。
如何把 hex 读作 ASCII
每对十六进制数字是一个字节,在 ASCII 中,每个小于 80 的字节就是一个字符。值得记住的范围:
| Hex | 字符 |
|---|---|
20 | 空格 |
30–39 | 数字 0–9 |
41–5A | A–Z |
61–7A | a–z |
21–2F | ! " # $ % & ' ( ) * + , - . / |
0A、0D | 换行和回车(0D 0A 是 Windows 换行) |
大写和小写字母正好相差 20:41 是 A,61 是 a。记住这一点再配合上表,短的 hex 用眼睛就能读出来。48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 是 Hello, world:2c 是逗号,20 是空格。
Hex 转 UTF-8:80 到 FF 的字节
基本英文以外的字符在 UTF-8 中都不止一个字节,而且这些字节全都大于等于 80。同样的字节,用不同字符集读取会得到不同的文本:
| Hex | 按 UTF-8 读取 | 按 Windows-1252 读取 |
|---|---|---|
63 61 66 c3 a9 | café | café |
e2 82 ac | € | € |
f0 9f 91 8b | 👋 | 👋 |
63 61 66 e9 | caf� | café |
前三行是 UTF-8 数据;最后一行是 Latin-1 或 Windows-1252 数据,其中 é 是单个字节 e9。一串 Ã 和 â 字符几乎总是意味着 UTF-8 字节被用单字节字符集读取了。如果换哪种字符集都得不到通顺的文本,这些字节很可能根本不是文本:看看状态栏中的 看起来像,识别出格式时它会给出名称。
Hex、Base64 与相同的字节
Hex 每个字节用两个字符,Base64 每三个字节用四个字符,所以同样的数据用 Base64 要短三分之一。如果你手里的内容以 SGVsbG8 之类开头,并且含有 f 之后的字母,那就是 Base64:用 Base64 转文本 解码。要把 hex 字节重新编码为 Base64 供 API 或配置文件使用,请用 Hex 转 Base64。hex、Base32、Base58 和 Base85 的比较 介绍了它们各自的使用场景。
在代码中把 hex 转为字符串
bytes.fromhex("48656c6c6f").decode("utf-8") # 'Hello'
bytes.fromhex("48 65 6c 6c 6f").decode("utf-8") # spaces are fine: 'Hello'
bytes.fromhex 会跳过空格,但不接受冒号和 0x,所以要先去掉它们。在 Node.js 中:
Buffer.from("48656c6c6f", "hex").toString("utf8"); // 'Hello'
Buffer.from("48zz65", "hex"); // <Buffer 48>
第二行展示了一个陷阱:Buffer.from 遇到第一个非 hex 字符就停止,返回已经读到的内容,而且不报错。更多用法见 Python 和 Node.js 页面。
常见问题
怎样把 hex 转为 ASCII?
粘贴 hex,读取输出即可。ASCII 只覆盖 00 到 7F 的字节,所以如果希望超出范围的字节显示为 � 而不是按 UTF-8 解读,请把 字符集 设为 ASCII。
48 65 6c 6c 6f 对应什么文本?
Hello。48 是 H,65 是 e,6c 是 l(两次),6f 是 o。
为什么我的 hex 变成了 é 之类的奇怪字符?
这些字节是 UTF-8,却被当作 Latin-1 或 Windows-1252 读取,或者反过来。c3 a9 在 UTF-8 中是 é,在 Windows-1252 中是 é。切换 字符集,直到文本显示正确。
“十六进制数字个数为奇数”是什么意思?
每个字节是两位十六进制数字,所以总位数必须是偶数。复制时丢了一位,通常在开头或结尾。检查输入的第一对和最后一对数字。
可以为某次转换生成链接吗?
可以。在页面地址后面加上 #in= 和 hex,例如 /hex-to-text/#in=48656c6c6f。# 之后的部分只留在浏览器中,不会发送到服务器。