问题描述
在zlib technical details的“最大扩展因子”部分中指出:“在最坏的情况下,其他块类型将扩展数据,通缩将退回到已存储(未压缩)的块。”
我很难弄清这个决定在zlib compress / deflate代码中的实际位置。我看到选择的deflate_stored
为0时会调用level
,这是有道理的,但除此之外,我看不到它被使用。
如果有人可以指出正确的方向,那将会有所帮助。
此外,采取这些决策的块粒度(就未压缩数据而言)是多少?我知道在压缩时,未压缩的块可以高达64KB,但是压缩块没有定义的块大小。显然,这与霍夫曼代码对块的有用性有关,但是很高兴知道是否有块大小可以做出这些决定。
解决方法
在tree.c(https://github.com/madler/zlib/blob/master/trees.c)中做出块级决策
,在trees.c中:
/* ===========================================================================
* Determine the best encoding for the current block: dynamic trees,static
* trees or store,and write out the encoded block.
*/
void ZLIB_INTERNAL _tr_flush_block(s,buf,stored_len,last)
块的大小以符号表示,即文字和长度/距离对的数量-而不是未压缩数据的大小。发射块的大小由内存设置确定,默认情况下为16383个符号。那时,或者在输入数据结束时(如果先到),确定是否将这些符号的动态,静态或存储块编码为最小。