Base85 编码器和解码器

Base85 会把 4 个字节压缩成 5 个 ASCII 字符,比 Base64 的「3 字节换 4 字符」比例更紧凑,因为它使用 85 个字符的字符集而不是 64 个。Adobe 的 Ascii85 变体存在于每个 PostScript 和 PDF 文件中;较新的 Z85(ZeroMQ)变体则避开了会在 C 语言字符串和 XML 中出问题的字符。本工具可对两者进行编码和解码,并可选择是否添加分隔符。

如何转换 Base85

  1. 1

    选择变体

    PDF/PostScript 素材用 Ascii85;源代码和网络协议用 Z85。

  2. 2

    粘贴文本或上传文件

    编码方向接受原始字节;解码方向接受 Base85 字符串。

  3. 3

    编码器按每 4 个字节分块

    每个 4 字节块会变成 5 个字符的 Base85 字符串。最后一块会先填充,再截去末尾多余部分。

  4. 4

    复制结果

    Ascii85 可选择用 `<~` 和 `~>` 分隔符包裹;Z85 不使用分隔符。

大小开销对比

编码 每 4 字节字符数 相对二进制的开销
Hex 8 +100%
Base64 5.33(含填充时向上取整为 8) +37%
Base85 5 +25%
原始二进制 4 0

因此 1 MB 二进制会变成 1.25 MB 的 Base85、1.33 MB 的 Base64、2 MB 的 hex。

Ascii85 与 Z85 的字符集

Ascii85(RFC 1924 / Adobe):ASCII 中 !u 的字符(33-117),并使用 z 作为 4 个零字节的简写。用于 PostScript 和 PDF 流中,形式为 <~...~>

Z85(ZeroMQ):一个避开引号字符和转义字符的子集:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#

可安全嵌入 JSON、XML、C 语言字符串和源代码,无需转义。

计算原理

每 4 个字节会被读作一个大端(big-endian)32 位整数 N。输出的 5 个字符是 N 在 85 进制下的各位数字,最高位在前。85^5 = 4 437 053 125,大于 2^32,所以 4 个字节总能放进 5 个字符。

什么时候 Ascii85 很重要

用文本编辑器打开任意 PDF 并搜索 ASCII85Decode — Adobe 用它作为嵌入图片和字体的过滤器,使这些内容能通过 7 位传输(旧式传真系统)。Z85 则广泛用于 ZeroMQ CURVE 身份验证密钥。

特殊情况

  • 全零的 4 字节块 — Ascii85 会把它编码为单个字符 z,而不是 !!!!!
  • 全空格的 4 字节块 — 一些变体用 y 表示四个空格,另一些则不用。
  • 最后的不完整块 — 用零字节填充,并在末尾截去相应数量的输出字符。

常见问题

论输出更小,是的。论通用兼容性,则不是。Base85 含有 <>&"(Ascii85 中)等字符,在 XML、JSON 和 URL 中需要转义。Z85 避免了这一点,但大多数工具原生支持的是 Base64。

处理 PostScript 或 PDF 文件时用 Ascii85。源代码、配置文件和网络协议用 Z85。RFC 1924 的 IPv6 编码是同一组 85 个字符的另一种分配方式,实际很少使用。

不可以。它们使用不同的字符集。用 Z85 的对照表去解码 Ascii85 会得到乱码。编码前先选定一种,并始终保持一致。

在 PDF 或 PostScript 流中使用 Adobe Ascii85 时需要,它们用于标记编码区域。单独使用以及所有 Z85 输出都不需要分隔符。

相关工具