【发布时间】:2013-10-30 00:19:41
【问题描述】:
我正在使用zlib 中发布的 gzip 代码的想法。
对于初始化,我使用deflateInit2(p_strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY)。
我正在压缩流。每个数据包都带有Z_FULL_FLUSH,除了我使用Z_FINISH的最后一个数据包。
压缩每个数据包后,我正在重新排序数据包。
数据包中的数据 ---> [zip] ---> [重新排序] ---> ...
如果我在压缩后膨胀数据,我会在压缩前得到准确的文件。
如果我在对数据包重新排序后对数据进行膨胀(同样:每个数据包都用Z_FULL_FLUSH 放气,最后一个Z_FINISH 除外)我得到一个与压缩前的原始文件非常相似的文件。不同之处在于文件的末尾:它缺少字节。那是因为当我给它充气时,我收到最后一个数据包的错误 (Z_DATA_ERROR)。如果我膨胀,比方说,用 50KB 的块,重新排序后的膨胀文件是与输入相同的文件,小于 Z_DATA_ERROR,但现在我在膨胀时丢失的数据更少(在我的示例中,我从原始文件中缺少一个字节)。
我不会重新排序最后一个数据包 (Z_FINISH)。
我尝试使用Z_FULL_FLUSH 发送所有数据包,然后发送另一个“空”数据包(仅Z_FINISH,即10 个字节)。
为什么会这样? 如果我使用 Z_FULL_FLUSH,为什么充气机不能正确充气? 它还记得放气包的顺序吗?
任何信息都会有所帮助, 谢谢。
【问题讨论】:
-
是什么让您觉得 zip 可以灵活地应对数据包重新排序?
-
它只是工作,我对文件进行膨胀并且它工作(除了最后一个膨胀块)。然后我明白了
Z_FULL_FLUSH负责它...
标签: c networking gzip zlib gzipstream