如何使用 Base16 编码器
- 在输入框中输入或粘贴文本,Base16 会随着输入实时显示在输出框中。
- 输入框下方的 字符集 决定字符如何转换成字节,默认为 UTF-8。
- 要解码,请点击工具上方的 Base16(RFC 4648)→ 文本,或点击 ⇄ 互换 按钮,它还会把当前输出移到输入框中。输入中的小写数字、空格和冒号都可以接受。
- 点击 复制输出 或 下载 结果。从 和 到 菜单可以切换到 Base32、Base64 等其他格式进行对比。
如果需要带分隔符、0x 前缀或小写输出的 hex,文本转 Hex 提供了这些选项。
Base16 与 RFC 4648
RFC 4648 把 Base64、Base32 和 Base16 放在一起定义,而 Base16 是三者中最简单的:没有填充和换行,也不需要重新分组比特。每个字节拆成两个 4 比特的半字节,每个半字节对应一个字符。RFC 自带的测试向量:
| 输入 | Base16 |
|---|---|
| (空) | (空) |
f | 66 |
fo | 666F |
foo | 666F6F |
foob | 666F6F62 |
fooba | 666F6F6261 |
foobar | 666F6F626172 |
输出长度总是正好等于字节数的两倍,所以 Base16 不需要填充字符。Base64 和 Base32 每块包含多个字节,必须用 = 补满最后一块。RFC 概览列出了这些编码分别定义在哪里。
Base16、Base32 与 Base64 对比
Hello, world 的 12 个字节在各 RFC 4648 编码下的结果:
| 编码 | 输出 | 长度 |
|---|---|---|
| Base16 | 48656C6C6F2C20776F726C64 | 24 |
| Base32 | JBSWY3DPFQQHO33SNRSA==== | 24(不带填充为 20) |
| Base64 | SGVsbG8sIHdvcmxk | 16 |
Base16 用体积换来了清晰。你可以直接从中读出字节并逐位比较数值,而且它能通过任何能处理字母和数字的系统,包括不区分大小写的系统。Base64 短三分之一,当字节需要放进 JSON、电子邮件或 URL 中传输时,它是默认选择。编码对比有更深入的介绍,还包括 Base58 和 Base85。
在哪里会见到 Base16
- 哈希摘要和校验和,
sha256sum等工具通常以小写输出。 - OpenPGP 密钥指纹,GnuPG 以每四个一组的大写 hex 显示。
- RFC 和其他规范中的测试向量,在这些场合字节值清晰无歧义比长度更重要。
- 需要不区分大小写或纯字母数字数据的协议和格式。
要把这样的值转成 Base64(例如某个 API 要求以 Base64 提交摘要),请用 Hex 转 Base64;反方向则用 Base64 转 Hex。
在代码中使用 Base16
import base64
base64.b16encode(b"Hello").decode() # '48656C6C6F'
base64.b16decode("48656c6c6f", casefold=True) # b'Hello'
printf 'Hello' | basenc --base16 # 48656C6C6F
echo 48656C6C6F | basenc --base16 -d # Hello
basenc 是 GNU coreutils 8.31 及以上版本的一部分。在 Node.js 中,Buffer.from("Hello").toString("hex").toUpperCase() 能得到同样的结果。Python 和 Bash 页面介绍了这些模块中 Base64 相关的部分。
常见问题
Base16 和十六进制是一回事吗?
对字节来说是的。Base16 是 RFC 4648 对 hex 编码的称呼:每个字节变成 0123456789ABCDEF 中的两个字符。RFC 规定使用大写,而日常使用的 hex 常常是小写。
Base16 比原始数据大多少?
正好大一倍,开销为 100%。Base32 增加 60%,Base64 约增加 33%,所以 Base16 是 RFC 4648 编码中最不紧凑、也最容易阅读的一种。
为什么 Python 的 b16decode 拒绝我的字符串?
base64.b16decode 默认只接受大写。小写输入请传入 casefold=True,或者改用 bytes.fromhex(),它接受大小写和空格。