在zlib压缩/放气代码中,库在哪里决定将块作为未压缩的块复制到压缩流中



在"最大膨胀系数";zlib技术细节的一节中;在最坏的情况下,其他块类型会扩展数据,收缩会回落到存储(未压缩(块">

我很难弄清楚在zlib压缩/放气代码中,这个决定实际上发生在哪里。我可以看到,当选定的level为0时,会调用deflate_stored,这是有道理的,但除此之外,我没有看到它被使用。

如果有人能为我指明正确的方向,那将是有帮助的。

此外,做出这些决策的块粒度(就未压缩数据而言(是多少?我知道在deflate中,未压缩的块可以高达64KB,但压缩的块没有定义块大小。很明显,这与霍夫曼代码对块的有用程度有关,但如果知道是否有块大小来做出这些决定,那就太好了。

在树中。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个符号。在那个时候,或者在输入数据的末尾(如果这是第一个(,确定那些符号的动态、静态或存储块是否将被编码为最小。

块级别的决策在tree.c中进行(https://github.com/madler/zlib/blob/master/trees.c)

最新更新