Base85 编码解码

将文本、十六进制字节或文件转换为 Base85,也可以反向解码。本页使用 RFC 1924 字符集,与 Python b85encode 的输出一致,也是 Git 二进制补丁所用的编码。

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 选择“编码”把文本或字节转换为 Base85,或选择“解码”把 Base85 还原为数据。
  2. 输入或粘贴内容,也可以打开文件。处理原始字节时请把输入切换为“十六进制”。
  3. 结果会随输入实时更新。解码时根据数据内容选择文本或十六进制输出。
  4. 复制结果,或将结果下载为文件。

什么是 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.isLSb`dHZ(42a{
你好<h`KfrM&

常见问题

Base85 和 Ascii85 一样吗?
两者的计算方法相同,但使用的字符不同,所以输出也不同。Ascii85 还会把 4 个零字节缩写为 z,并可能带有 Adobe 定界符。处理 PDF 和 PostScript 数据请使用 Ascii85 页面。
RFC 1924 是正式标准吗?

不是。它是一篇作为愚人节玩笑发布的信息类 RFC,从未真正用于 IPv6 地址。它的字符集是后来通过 Git 和 Python 流行起来的。

Base85 编码后体积会增加多少?
每 4 个字节变成 5 个字符,输出约为原数据的 1.25 倍,而 Base64 约为 1.33 倍。basE91 还要更紧凑一些。
Base85 可以放进 JSON 或 XML 吗?
放进 JSON 没有问题,因为字母表中没有双引号和反斜杠,无需转义。在 XML 和 HTML 中,<、>、& 需要转义。Base85 也不能直接用于 URL。