使用方法
- 选择“编码”把文本或字节转换为 Base85,或选择“解码”把 Base85 还原为数据。
- 输入或粘贴内容,也可以打开文件。处理原始字节时请把输入切换为“十六进制”。
- 结果会随输入实时更新。解码时根据数据内容选择文本或十六进制输出。
- 复制结果,或将结果下载为文件。
什么是 Base85?
Base85 是一类把每 4 个字节转换为 5 个字符的编码。5 位 85 进制数可以表示 4,437,053,125 个值,刚好能容纳任意 32 位整数,因此编码后只增大 25%,而 Base64 要增大 33%。
Base85 有多种互不兼容的字母表:Ascii85(Adobe、PDF)、Z85(ZeroMQ),以及本页使用的这一种。它由 0-9、A-Z、a-z 和 23 个符号 !#$%&()*+-;<=>?@^_`{|}~ 组成,不包含引号、逗号、句点、斜杠、冒号、反斜杠和方括号。
RFC 1924、Git 和 Python
这套字符集出自 RFC 1924《A Compact Representation of IPv6 Addresses》。它发布于 1996 年 4 月 1 日,是一篇愚人节 RFC,提议把 128 位 IPv6 地址写成一个固定 20 位的 85 进制数。实际上没有人这样书写 IPv6 地址,但这套字母表后来被用于通用的二进制数据:
- Git 在补丁中保存二进制文件时(
git diff --binary、git format-patch),会先用 zlib 压缩数据,再用这套字母表编码,并在每行开头加一个长度字符。 - Python 3.4 及以上版本提供
base64.b85encode()和b85decode(),输出与本工具一致。 - Mercurial 在 Git 格式的差异中也用同样的编码表示二进制文件。
需要注意的是,RFC 1924 把整个 128 位地址一次性转换,而 Git、Python 和本工具按 4 字节分组处理,所以同一个 16 字节的值,结果与 RFC 的方法不同。
末尾不足 4 字节的处理
当输入长度不是 4 的整数倍时,最后一组会用零字节补齐后再编码,只保留前 n + 1 个字符:1 个字节变成 2 个字符,2 个字节变成 3 个,3 个字节变成 4 个。解码时会反向处理,因此不需要填充字符。与 Ascii85 的 z 不同,这种变体没有零字节的缩写。
# Python 3.4+
import base64
base64.b85encode(b'hello') # b'Xk~0{Zv'
base64.b85decode(b'Xk~0{Zv') # b'hello'
编码规格
| 字母表 | 0-9 A-Z a-z !#$%&()*+-;<=>?@^_`{|}~ |
|---|---|
| 输出体积 | 每 4 字节输出 5 个字符(125%) |
| 填充 | 无 |
| 标准 | RFC 1924 字符集(Git、Python b85) |
| 区分大小写 | 是 |
编码示例
| 输入 (UTF-8) | 输出 |
|---|---|
Hello, World! | NM&qnZ!92JZ*pv8Ap |
Base64.is | LSb`dHZ(42a{ |
你好 | <h`KfrM& |
常见问题
Base85 和 Ascii85 一样吗?
z,并可能带有 Adobe 定界符。处理 PDF 和 PostScript 数据请使用 Ascii85 页面。RFC 1924 是正式标准吗?
不是。它是一篇作为愚人节玩笑发布的信息类 RFC,从未真正用于 IPv6 地址。它的字符集是后来通过 Git 和 Python 流行起来的。
Base85 编码后体积会增加多少?
Base85 可以放进 JSON 或 XML 吗?
<、>、& 需要转义。Base85 也不能直接用于 URL。