有没有办法知道deflate(或你的Z_STREAM)是否有缓冲数据? zlib C ++

时间:2016-04-12 18:27:54

标签: c++ compression zlib

zlib会告诉您是否有数据被缓冲等待收缩,直到有足够数量的数据要压缩? Z_STREAM中的其中一个变量或其他地方能够显示这个吗?

基本上我想强制z流进行刷新,但仅限于文件末尾(在不断更新的文件上)以便读取,压缩直到eof,读取,压缩直到等等。如果我在eof上进行刷新z_finish然后在下一次读取之前调用resetdeflate,这应该是正确的吗?它应该刷新缓冲区,重置流并继续?

1 个答案:

答案 0 :(得分:1)

不,deflate没有变量或函数可以告诉您在发出压缩数据之前已累积了多少数据。它可以回答一个不同的问题,deflatePending(),它将告诉你有多少压缩字节和发出的块的位还要写入用户的输出缓冲区。

是的,要结束deflate流,请使用Z_FINISH然后调用deflate(),直到它没有更多输出为止。您可以使用deflateReset()来关注该结构,以重新使用该结构来启动新的deflate流。

如果您经常这样做,例如对于写入文件的每一行,您将得到糟糕的压缩,因为单行通常不会是非常可压缩的。您可能正在寻找的是类似gzlog的内容,它为压缩的gzip文件添加了行,在每个附加上保持其作为压缩gzip流的正确性,同时仍提供良好的压缩。