使用方法
- 选择“编码”把文本转换为 Base32hex,或选择“解码”把 Base32hex 还原为文本。
- 保持选择 Base32hex 变体。如果目标格式需要,可以关闭“填充”或勾选“小写”。
- 输入或粘贴内容,也可以打开文件,结果会随输入实时更新。
- 复制结果,或将结果下载为文件。
什么是 Base32hex?
Base32hex 是 RFC 4648 第 7 节定义的“使用扩展十六进制字母表的 Base32 编码”。它的工作方式与标准 Base32 完全相同:每个字符承载 5 位,每 5 个字节变成 8 个字符,并用 = 填充到 8 的倍数,区别只在于字母表。Base32hex 不使用 A-Z 2-7,而是接着十六进制继续往下数:数字 0 到 9 代表 0 到 9,A 代表 10,一直到 V 代表 31。
由于两种字母表的字符大量重叠,把 Base32hex 字符串交给标准 Base32 解码器往往不会报错,但得到的字节是错的。解码时务必选择与编码时相同的变体。
保持排序
Base32hex 的字母表按 ASCII 升序排列,每个字符的值随位置递增,因此逐字符比较两个 Base32hex 字符串,得到的顺序与比较原始字节完全一致。RFC 4648 特别指出了这一点,这是标准 Base32 和 Base64 不具备的特性,也让 Base32hex 适合用作数据库、键值存储等有序存储中的键。
请让所有字符串保持同一种大小写;当输入长度不同时,最好关闭填充,因为 = 在 ASCII 中位于数字和字母之间,可能打乱顺序。
DNSSEC NSEC3 中的 Base32hex
RFC 5155 定义的 NSEC3 记录用于证明某个域名不存在,同时让人更难枚举区域内的全部域名。每个域名都会经过 SHA-1 哈希,20 字节的哈希值写成 32 个字符的 Base32hex 标签,不带填充,通常显示为小写。由于编码保持了哈希值的顺序,这些哈希名可以构成一条有序链。若要把哈希值转换为这样的标签,可以以十六进制形式输入哈希,关闭“填充”并勾选“小写”。本工具只负责编码这一步,不会计算加盐迭代的 NSEC3 哈希。
在代码中使用 Base32hex
# Python 3.10+
import base64
base64.b32hexencode(b'foobar') # b'CPNMUOJ1E8======'
base64.b32hexdecode('CPNMUOJ1E8======') # b'foobar'
// Go (import "encoding/base32")
base32.HexEncoding.EncodeToString(data)
base32.HexEncoding.WithPadding(base32.NoPadding).EncodeToString(data)
编码规格
| 字母表 | 0-9 A-V |
|---|---|
| 输出体积 | 每 5 字节输出 8 个字符(160%) |
| 填充 | 用 = 补足到 8 的倍数 |
| 标准 | RFC 4648 第 7 节 |
| 区分大小写 | 否 |
编码示例
| 输入 (UTF-8) | 输出 |
|---|---|
Hello, World! | 91IMOR3F5GG5ERRIDHI22=== |
Base64.is | 89GN6P9M6GN6ISO= |
你好 | SIUQ1PD5NK====== |
常见问题
Base32 和 Base32hex 有什么区别?
A-Z 2-7,Base32hex 使用 0-9 A-V,因而能保持数据的排序。两者不能混用。Base32hex 区分大小写吗?
字母表以大写定义,但本工具解码时也接受小写输入。如果需要小写输出(例如用于 DNS 标签),勾选“小写”即可。
需要使用填充吗?
= 填充到 8 个字符的整数倍,但包括 NSEC3 在内的许多格式都省略填充。解码器两种写法都接受,请按接收方的要求选择。