使用方法
- 选择“编码”把文本或字节转换为 Ascii85,或选择“解码”把 Ascii85 还原为数据。
- 如果结果要用于 PostScript,或需要与 Python a85encode 的 adobe=True 输出一致,请开启 Adobe 定界符。
- 如有需要,设置换行宽度,把较长的输出分成多行。
- 输入、粘贴或打开文件,然后复制或下载结果。解码时会自动忽略定界符、空格和换行。
什么是 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.is | 6=FqH2Dd%#Er |
你好 | jLq5JV7c |
常见问题
Ascii85 和 Base85 有什么区别?
为什么输出中有字母 z?
z 代表一个完整分组中的 4 个零字节。解码器会自动把它还原,数据不会有任何变化。一定要加 Adobe 定界符吗?
只有当读取数据的程序需要时才要加,例如 PostScript 解释器,或开启 adobe=True 的 Python a85decode。很多工具不带定界符也能识别。本工具解码时,定界符可有可无。
可以解码 PDF 中的 ASCII85 数据流吗?
可以。粘贴数据流内容,选择十六进制输出或直接下载结果。如果该数据流的过滤器在 ASCII85Decode 之后还有 FlateDecode,解码得到的字节仍是 zlib 压缩数据,需要再解压一次。
为什么提示无效字符?
! 到 u 的字符,以及出现在分组之间的 z。部分 btoa 版本和 Python foldspaces=True 使用的 y(代表 4 个空格)不属于 Adobe 格式,会被视为无效字符。