库在zlib压缩/放气代码中的哪个位置决定应将一个块以未压缩的形式复制到压缩的流中?

问题描述

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个符号。那时,或者在输入数据结束时(如果先到),确定是否将这些符号的动态,静态或存储块编码为最小。