库在 zlib compress/deflate 代码中的哪个位置决定应将未压缩的块复制到压缩流中?
Where in the zlib compress/deflate code does the library decide that a block should be copied as uncompressed into the compressed stream?
在 zlib technical details 的“最大扩展因子”部分指出“在最坏的情况下,其他块类型会扩展数据,通货紧缩会回落到存储的(未压缩的)块。 “
我很难弄清楚在 zlib compress/deflate 代码中这个决定实际发生的位置。我可以看到当所选 level
为 0 时调用 deflate_stored
,这是有道理的,但除此之外我没有看到它被使用。
如果有人能指出正确的方向,那将会很有帮助。
此外,做出这些决定的块粒度(就未压缩数据而言)是多少?我知道在 deflate 中未压缩的块可以达到 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)
块的大小以 符号 衡量,即文字和 length/distance 对的数量 -- 而不是未压缩数据的大小。发射块的大小由内存设置决定,默认情况下为 16383 个符号。那时,或者在输入数据的末尾(如果先出现的话),确定那些符号的动态、静态或存储块是否将被编码为最小。
在 zlib technical details 的“最大扩展因子”部分指出“在最坏的情况下,其他块类型会扩展数据,通货紧缩会回落到存储的(未压缩的)块。 “
我很难弄清楚在 zlib compress/deflate 代码中这个决定实际发生的位置。我可以看到当所选 level
为 0 时调用 deflate_stored
,这是有道理的,但除此之外我没有看到它被使用。
如果有人能指出正确的方向,那将会很有帮助。
此外,做出这些决定的块粒度(就未压缩数据而言)是多少?我知道在 deflate 中未压缩的块可以达到 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)
块的大小以 符号 衡量,即文字和 length/distance 对的数量 -- 而不是未压缩数据的大小。发射块的大小由内存设置决定,默认情况下为 16383 个符号。那时,或者在输入数据的末尾(如果先出现的话),确定那些符号的动态、静态或存储块是否将被编码为最小。