动态块头长度的上限可以很容易地从您已经提供的参考中计算出来。从 RFC 1951 的第 3.2.7 节我们可以将这些位相加:
3 + 5 + 5 + 4 + 19 * 3 + (286 + 30) * 7 = 2286 位 = 285.75 字节。
(详情请参阅下面的计算说明。)
实际上,您永远不会看到接近 286 字节的长度。更典型的长度是 60 到 90 个字节。
这是来自 gzip 压缩的 linux 源代码分布的动态标头块长度的直方图,linux-3.1.6.tar.gz:
它们看起来并不一样。这是Archive.pax.gz(应用程序分发)的另一个:
双峰形状可能是可执行文件与文本。可执行文件对所有文字字节值进行编码,从而生成更大的动态标头来描述所有这些值的代码。
计算笔记:
我故意不为符号 16、17 或 18 添加可能的额外位,因为使用这些代码中的任何一个,包括它们的额外位,都会减少标头的长度,而不是增加它。 16 符号将用 9 位替换 21 到 42 位,17 符号将用 10 位替换 21 到 70 位,18 符号将用 14 位替换 77 到 966 位(假设所有符号都是 7 位) .
即使没有使用 16、17 和 18,仍然有 19 个初始代码长度,因为它们是先存储的。
我将文字/长度代码长度限制为 286,距离代码长度限制为 30,因为兼容的充气机将拒绝高于该值的值。
2286 是可能的最低上限,因为在 deflate 格式中没有将标头构造为最优的约束。可以将代码长度代码构造为,例如,长度 4、5、8 和 9 都是 7 位代码,然后仅使用长度列表中的那些来构造完整的文字/长度和距离代码。代码长度代码也必须是完整的,但这可以通过将较短的代码分配给未使用的长度来实现。
简而言之,可以构造一个长度为 2286 位的完全有效的动态块头。事实上,这里有一个(有很多方法可以做到这一点):
ed fd 01 e0 38 70 1c 28 a7 fc 7e bf df ef f7 fb
fd 7e bf df ef f7 fb fd 7e bf df ef f7 fb fd 7e
bf df ef f7 fb fd 7e bf df ef f7 fb fd 7e bf df
ef f7 fb fd 7e bf df ef f7 fb fd 7e bf df ef f7
fb fd 7e bf df ef f7 fb fd 7e bf df ef f7 fb fd
7e bf df ef f7 fb fd 7e bf df ef f7 fb fd 7e bf
df ef f7 fb fd 7e bf df ef f7 fb fd 7e bf df ef
f7 fb fd 7e bf df ef f7 fb fd 7e bf df ef f7 fb
fd 7e bf df ef f7 fb fd 7e bf df ef f7 fb fd 7e
bf df ef f7 fb fd 7e bf df ef f7 fb fd 7e bf df
ef f7 fb fd 7e bf df ef f7 fb fd 7e bf df ef f7
fb fd 7e bf df ef f7 fb fd 7e bf df ef f7 fb fd
7e bf df ef f7 fb fd 7e bf df ef f7 fb fd 7e ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff f9 7c bf df ef f7 fb fd 7e bf df ef
f7 fb fd 7e bf df ef f7 fb fd 7e bf df ef 23
这是一个以十六进制表示的有效且完整的放气流。它由一个动态块组成,标记为最后一个块,带有一个 2286 位的动态头和一个 9 位的块结束码,共 2295 位,四舍五入为 287 字节。它解压缩到零字节,没有错误。