gpt4 book ai didi

c - 为什么重新排序 gzip 数据包会损坏输出?

转载 作者:太空宇宙 更新时间:2023-11-04 06:31:55 27 4
gpt4 key购买 nike

我正在使用 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 的 block ,重新排序后膨胀的文件与输入文件相同,小于 50KB(整个最后一个数据包都消失了导致错误)。如果我将膨胀 block 大小减小到 8B,我仍然会得到 Z_DATA_ERROR,但现在我在膨胀时丢失的数据更少,(在我的示例中,我缺少原始文件中的一个字节)。

我不会重新排序最后一个数据包 (Z_FINISH)。我尝试发送所有带有 Z_FULL_FLUSH 的数据包,然后发送另一个“空”数据包(仅 Z_FINISH,即 10 个字节)。

为什么会这样?如果我使用 Z_FULL_FLUSH,为什么充气机不能正确充气?它记得放气包的顺序吗?

任何信息都会有所帮助,谢谢。

最佳答案

由于您使用的是 Z_FULL_FLUSH,它会在每次刷新时删除历史记录,因此您可以重新排序数据包,除了最后一个。您在 上执行的 Z_FINISH 必须是最后一个数据包。它不需要任何数据。您可以使用 Z_FULL_FLUSH 从最后一个数据包中获取所有数据,然后在没有输入数据和 Z_FINISH 的情况下执行最后一个数据包。这将允许您随心所欲地在那个空的数据包之前重新排序数据包。始终将最后一个放在最后。

原因是 deflate 格式是自终止的,因此最后一段标志着流的结束。如果你将它重新排序到中间的某个地方,那么当它到达那个数据包时膨胀就会停止。

需要在开始和结束时维护gzip header和trailer,并相应更新trailer中的CRC。最后的CRC校验取决于数据的顺序。

为什么要尝试做您正在尝试做的事情?你在优化什么?

关于c - 为什么重新排序 gzip 数据包会损坏输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19671611/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com