0

根据维基百科:

[Ascii85 使用] ASCII 字符 33 (!) 到 117 (u) 包括在内(表示基数为 85 的数字 0 到 84),以及字母 z(作为表示 32 位 0 值的特殊情况)。

[btoa] 4.2 版为一组所有 ASCII 空格字符添加了“y”例外

虽然 0 数据可能很常见,但使用z压缩 0 似乎是一种任意优化,并不总是有用。

y同样,仅当原始字节包含相邻空格时才使用较少的使用。空间的 Unicode 编码实际上在 Unicode 文本20 000x20202020并不常见。

二进制数据确实经常有相邻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 规范在压缩方面没有更具侵略性?

4

2 回答 2

3

在某些应用程序中,能够找到编码字符串的第 N 个八位字节而无需扫描整个内容是很有用的。压缩会干扰这一点。然而,在其他应用中,某些形式的压缩可能是有用的。如果可以使用超过 85 个不同的字符,则 base-85 编码将允许使用主集之外的字符进行轻松压缩。即使一个被限制为一组精确的 85 个字符,五个 base-85 字符的序列数也大于一个、两个、三个和四个 base-256 字节序列的组合数,因此会有空间使用一些特殊的字符组合来指示某些字符值的运行。

于 2016-09-12T22:12:50.153 回答
3

因为您通常会在使用 ASCII85 编码之前使用压缩程序,这比建议的 ad hoc 编码做得更好。

于 2016-07-19T01:09:05.583 回答