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

is there a way to know if deflate (or your Z_STREAM) has data being buffered? zlib C++

zlib 是否会让您知道是否有数据正在缓冲等待放气,直到有足够数量的数据要压缩? Z_STREAM 或其他地方的变量之一是否能够显示这一点?

基本上我想强制 z 流刷新,但只在文件末尾(在不断更新的文件上)所以读取、压缩直到 eof、读取、压缩直到 eof 等。如果我刷新 z_finish 在 eof 上,然后在下次读取之前调用 resetdeflate 应该可以解决问题吗?它应该刷新缓冲区,重置流并继续吗?

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

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

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