我正在尝试使用zlib压缩任意数据流,但我只有一个固定大小,小(仅几KB)的输出文件,用于存储生成的压缩数据。我想尽可能多地压缩输入数据,然后由于输出尺寸有限而无法处理任何剩余的输入是可以接受的。
所有zlib示例似乎都假设deflate()生成的所有输出都可以被使用并写入输出文件。在我的情况下,当输出文件空间不足时,我可能被迫停止在流中。但是,当我循环调用deflate()时,我总是知道输出文件中剩余的空间,并且我从未将avail_out设置为超过剩余空间的值。我总是通过Z_SYNC_FLUSH来放气。我担心,因为文档说当deflate()返回avail_out == 0(在我的情况下几乎总是发生),可能还有更多的输出数据要消耗,我需要再次调用deflate()。我的情况我不能总是再次调用deflate()因为我没有剩余的输出文件空间来存储它可能返回的任何其他压缩数据。
那么,在使用Z_SYNC_FLUSH调用deflate()之后的任何任意点处,在处理输入的中间纾困是可以的,并且当将所有压缩数据返回到并包括那个时,期望inflate()成功点?并且,Z_SYNC_FLUSH是正确/最好的方法吗?同样,这种方法似乎在实验上有效,但我并不相信它只会在阅读zlib文档的基础上发挥作用。
答案 0 :(得分:3)
从技术上讲,是的,您可以在任何字节处切断一个deflate流,并且inflate将能够处理到您的最后一个字节并解压缩所提供的部分deflate流中的任何内容。
然而,这不是一个好主意,因为a)您在流的末尾丢失了完整性检查,并且b)您有额外的工作来确定未压缩数据的结束位置,以便您可以发送其余的我认为它在另一个数据包中。做b)的唯一方法是在压缩端复制解压缩过程。
或者你可以使用fitblk.c,它会做三个deflate传递来构建适合固定大小输出块的真正的deflate流。