DEFLATE(zlib)如何确定块大小?

7
我想知道DEFLATE(也就是zlib压缩格式中)是如何确定块大小的。
在RFC 1951中,它解释了以下内容:
“压缩器会在决定使用新的树创建一个新块时终止当前块,或者当块大小填满了压缩器的块缓冲区时终止当前块。”
但这并不足够。我想详细了解什么条件需要结束当前块并开始新的块。
DEFLATE是如何判断是否需要使用新树的?压缩器的块缓冲区大小是多少?
1个回答

10

zlib的deflate函数在以下两种情况下结束当前数据块:当符号缓冲区填满(默认为16,383个符号),或者输入数据结束(请求使用Z_FINISH参数)。zlib中的deflate函数不会试图判断在何时提前结束数据块是否有益。

在这种情况下,一个符号可以是一个字面值或任意长度的匹配项。

符号缓冲区的大小由deflateInit2()函数的memLevel参数确定。使用deflateInit()默认值的memLevel为8,导致符号缓冲区大小为16,383个符号。 memLevel可以是1到9,其中符号缓冲区大小为(1 << (memLevel + 6)) - 1


1
对我而言,这似乎是一个微不足道的优化。在下一个块的开头,取旧代码长度和新代码长度之间的差异,并将其分别乘以符号频率。如果总和小于结束代码大小加上新表的大小,并且新表不使用任何零长度代码,则推迟它们并继续使用旧表发出新块。 - sh1
1
我们应该指出,Deflate压缩不需要多个块。数GB的数据可以在一个单独的块中。新块只是给我们提供了机会改善哈夫曼树并提高压缩比率。 - Ivan Kuckir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接