Ascii85 编码解码

将文本、十六进制字节或文件转换为 Ascii85,也可以反向解码。Ascii85 是 PostScript 和 PDF 使用的 Base85 变体,可添加 Adobe 定界符,或把较长的输出分行。

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

使用方法

  1. 选择“编码”把文本或字节转换为 Ascii85,或选择“解码”把 Ascii85 还原为数据。
  2. 如果结果要用于 PostScript,或需要与 Python a85encode 的 adobe=True 输出一致,请开启 Adobe 定界符。
  3. 如有需要,设置换行宽度,把较长的输出分成多行。
  4. 输入、粘贴或打开文件,然后复制或下载结果。解码时会自动忽略定界符、空格和换行。

什么是 Ascii85?

Ascii85 每次读取 4 个字节,把它们当作一个 32 位整数,再写成 5 位 85 进制数。这些“数字”是从 !(编码 33)到 u(编码 117)的 85 个连续 ASCII 字符,每个字符就是数值加上 33。编码后体积增加 25%,而 Base64 要增加 33%。

这种格式最早用于 Unix 的 btoa 工具。Adobe 后来把它作为 PostScript Level 2 和 PDF 的 ASCII base-85 编码,让图片、字体等二进制数据可以放在纯文本文件里。Python 提供了 base64.a85encode(),Go 提供了 encoding/ascii85 包。

z 缩写与 Adobe 定界符

4 个零字节本来会编码成 5 个感叹号,Ascii85 则用一个 z 代替,让连续的空数据更短。这个缩写只用于完整的 4 字节组。当输入长度不是 4 的整数倍时,最后 n 个字节会编码为 n + 1 个字符,并且不会被缩写。

PostScript 用 <~ 和 ~> 包围一段 Ascii85 字符串。PDF 中使用 ASCII85Decode 过滤器的数据流只用结尾的 ~> 作为数据结束标记。本工具解码时会自动去掉这两种定界符并忽略空白字符,因此可以直接粘贴 PDF 或 PostScript 文件中的数据流。

在代码中使用 Ascii85

# Python 3.4+
import base64
base64.a85encode(b'hello')                      # b'BOu!rDZ'
base64.a85encode(b'hello', adobe=True)          # b'<~BOu!rDZ~>'
base64.a85decode(b'<~BOu!rDZ~>', adobe=True)    # b'hello'

// Go
import "encoding/ascii85"
dst := make([]byte, ascii85.MaxEncodedLen(len(src)))
n := ascii85.Encode(dst, src)

编码规格

字母表ASCII 33(!)到 117(u),另加 z
输出体积每 4 字节输出 5 个字符(125%)
填充无,可选 <~ ~> 定界符
标准Adobe PostScript 与 PDF
区分大小写是

编码示例

输入 (UTF-8)输出
Hello, World!87cURD_*#4DfTZ)+T
Base64.is6=FqH2Dd%#Er
你好jLq5JV7c

常见问题

Ascii85 和 Base85 有什么区别?
两者都把 4 个字节编码为 5 个字符,但字母表不同。Ascii85 使用从 ! 到 u 的字符,并支持 z 缩写;Base85 页面使用 Git 和 Python b85encode 采用的 RFC 1924 字母表;Z85 则是 ZeroMQ 的变体。
为什么输出中有字母 z?
每个 z 代表一个完整分组中的 4 个零字节。解码器会自动把它还原,数据不会有任何变化。
一定要加 Adobe 定界符吗?

只有当读取数据的程序需要时才要加,例如 PostScript 解释器,或开启 adobe=True 的 Python a85decode。很多工具不带定界符也能识别。本工具解码时,定界符可有可无。

可以解码 PDF 中的 ASCII85 数据流吗?

可以。粘贴数据流内容,选择十六进制输出或直接下载结果。如果该数据流的过滤器在 ASCII85Decode 之后还有 FlateDecode,解码得到的字节仍是 zlib 压缩数据,需要再解压一次。

为什么提示无效字符?
Ascii85 只允许从 ! 到 u 的字符,以及出现在分组之间的 z。部分 btoa 版本和 Python foldspaces=True 使用的 y(代表 4 个空格)不属于 Adobe 格式,会被视为无效字符。