提问者:小点点

如何紧缩成固定大小的输出文件?


我试图使用zlib压缩任意数据流,但我只有一个固定大小的小(只有几KB)输出文件来存储压缩后的数据。我希望压缩尽可能多的输入数据,然后可以对由于输出大小有限而无法处理的任何剩余输入进行调整。

所有zlib示例似乎都假设deflate()生成的所有输出都可以被消耗并写入输出文件。在我的情况下,当输出文件空间不足时,我可能会被迫停止中流。然而,当我循环调用deflate()时,我总是知道输出文件中剩余的空间,并且我从未将avail_out设置为超过剩余空间的值。我总是通过Z_SYNC_FLUSH来放气。我很担心,因为文档中说,当deflate()返回avail_out==0时(在我的情况下几乎总是这样),可能还有更多的输出数据需要消耗,我需要再次调用deflate)。我不能总是再次调用deflate(),因为我没有更多的输出文件空间来存储它可能返回的任何其他压缩数据。

那么,在处理输入的过程中,在用Z_SYNC_FLUSH调用deflate()后的任意点退出,并期望在将所有返回到该点(包括该点)的压缩数据交给inflate()时,inflates()会成功吗?而且,Z_SYNC_FLUSH是这里的正确/最佳方法吗?同样,这种方法似乎是实验性的,但我不相信它只会在阅读zlib文档的基础上发挥作用。


共1个答案

匿名用户

从技术上讲,是的,您可以在任何字节处截断一个deflate流,而inflate将能够处理到最后一个字节,并从提供的部分deflate数据流中解压缩任何数据。

然而,这并不是一个好主意,因为a)您在流的末尾丢失了完整性检查,b)您有额外的工作来确定未压缩的数据在哪里结束,以便您可以在另一个包中发送它的剩余部分,我想。完成b)的唯一方法是在压缩端重复解压缩过程。

或者,您可以使用fitblk.c,它执行三次deflate操作来构建适合固定大小输出块的真正的deflate流。