根据维基百科:
[Ascii85 使用] ASCII 字符 33 (!) 到 117 (u) 包括在内(表示基数为 85 的数字 0 到 84),以及字母 z(作为表示 32 位 0 值的特殊情况)。
[btoa] 4.2 版为一组所有 ASCII 空格字符添加了“y”例外
虽然 0 数据可能很常见,但使用z
压缩 0 似乎是一种任意优化,并不总是有用。
y
同样,仅当原始字节包含相邻空格时才使用较少的使用。空间的 Unicode 编码实际上在 Unicode 文本20 00
中0x20202020
并不常见。
二进制数据确实经常有相邻00
的 's,但它也经常包含相邻FF
的 's。
文本数据通常包含相邻的空格,但也经常包含相邻的制表符或相邻的换行符。
似乎频率分析和使用 9 或 10 个字符(Ascii 字符 118-126/127,或v
通过~
/ DEL)来表示 9/10 最常见的 32 位值,可能会导致更好的压缩。
压缩字符到 32 位值的映射可能位于包含在<[
和之间的编码字符串的开头]>
。对于 4 个重复字节的 32 位值,32 位值可以缩写为重复的十六进制值。
例如:
二进制数据(192 字节):
00 00 00 00 FF FF FF FF 20 20 20 20 2D 2D 2D 2D 09 09 09 09 0D 00 0A 00
00 00 00 00 FF FF FF FF 20 20 20 20 2D 2D 2D 2D 09 09 09 09 0D 00 0A 00
00 00 00 00 FF FF FF FF 20 20 20 20 2D 2D 2D 2D 09 09 09 09 0D 00 0A 00
00 00 00 00 FF FF FF FF 20 20 20 20 2D 2D 2D 2D 09 09 09 09 0D 00 0A 00
00 00 00 00 FF FF FF FF 20 20 20 20 2D 2D 2D 2D 09 09 09 09 0D 00 0A 00
00 00 00 00 FF FF FF FF 20 20 20 20 2D 2D 2D 2D 09 09 09 09 0D 00 0A 00
00 00 00 00 FF FF FF FF 20 20 20 20 2D 2D 2D 2D 09 09 09 09 0D 00 0A 00
00 00 00 00 FF FF FF FF 20 20 20 20 2D 2D 2D 2D 09 09 09 09 0D 00 0A 00
注意空格
20
、连字符2D
、制表符09
和 Unicode 回车换行符的存在0D 00 0A 00
可以编码为(79 字节)
<[00;FF;20;2D;09;0D000A00]><~vxyz{|vxyz{|vxyz{|vxyz{|vxyz{|vxyz{|vxyz{|vxyz{|~>
使用这种压缩的编码方法有优点吗?为什么各种 Ascii85 规范在压缩方面没有更具侵略性?