Compression 在zlib compress/deflate代码中,库在哪里决定将块作为未压缩复制到压缩流中?

Compression 在zlib compress/deflate代码中,库在哪里决定将块作为未压缩复制到压缩流中?,compression,zlib,deflate,Compression,Zlib,Deflate,在“最大扩展系数”一节中指出,“在最坏的情况下,其他块类型将扩展数据,压缩将返回到存储(未压缩)的块。” 我很难弄清楚在zlib/代码中这个决定实际上发生在哪里。我可以看到,当所选的级别为0时,调用存储的deflate\u,这是有意义的,但除此之外,我没有看到它被使用 如果有人能给我指出正确的方向,那会很有帮助 此外,做出这些决策的块粒度(就未压缩数据而言)是多少?我知道在deflate中,未压缩的块可以高达64KB,但是没有为压缩的块定义块大小。显然,这与哈夫曼代码对块的有用程度有关,但最好知

在“最大扩展系数”一节中指出,“在最坏的情况下,其他块类型将扩展数据,压缩将返回到存储(未压缩)的块。”

我很难弄清楚在zlib/代码中这个决定实际上发生在哪里。我可以看到,当所选的
级别
为0时,调用存储的
deflate\u
,这是有意义的,但除此之外,我没有看到它被使用

如果有人能给我指出正确的方向,那会很有帮助


此外,做出这些决策的块粒度(就未压缩数据而言)是多少?我知道在deflate中,未压缩的块可以高达64KB,但是没有为压缩的块定义块大小。显然,这与哈夫曼代码对块的有用程度有关,但最好知道是否有一个块大小来作出这些决定。

块级别的决定是在树中作出的。c()

块级别的决定是在树中作出的。c()

这里是:

块的大小是用符号来度量的,即文字和长度/距离对的数量,而不是未压缩数据的大小。发出的块的大小由内存设置确定,默认情况下为16383个符号。此时,或者在输入数据的末尾(如果先到的话),确定这些符号的动态、静态或存储块是否编码为最小的块。

此处为:


块的大小是用符号来度量的,即文字和长度/距离对的数量,而不是未压缩数据的大小。发出的块的大小由内存设置确定,默认情况下为16383个符号。此时,或者在输入数据的末尾(如果先到的话),确定这些符号的动态、静态或存储块是否编码为最小的。

感谢您的详细解释。因此,为了我自己的澄清,输入被压缩,直到生成16383个符号,然后
\u tr\u flush\u blocks
决定是发出存储的、动态的还是静态的块?对于zlib的当前实现和默认内存设置,正确。对于何时发出deflate块,有很多选择,包括使用关于数据的试探法,而不是固定数量的符号。感谢您的详细解释。因此,为了我自己的澄清,输入被压缩,直到生成16383个符号,然后
\u tr\u flush\u blocks
决定是发出存储的、动态的还是静态的块?对于zlib的当前实现和默认内存设置,正确。对于何时发出deflate块,可以做出许多选择,包括使用关于数据的试探法,而不是固定数量的符号。
/* ===========================================================================
 * 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)