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

C 为什么重新排序gzip数据包会损坏输出?,c,networking,gzip,zlib,gzipstream,C,Networking,Gzip,Zlib,Gzipstream,我使用的是发布在中的gzip代码的思想。 对于初始化,我使用deflateInit2(p\u strm,Z\u DEFAULT\u COMPRESSION,Z\u DEFLATED,(15+16),8,Z\u DEFAULT\u策略)。 我在拉一条小溪的拉链。每个数据包都有Z_FULL_FLUSH,但最后一个数据包除外,我使用Z_FINISH。 在压缩每个数据包之后,我将对数据包重新排序 数据包中的数据-->[zip]-->[reordering]--> 如果我在压缩后对数据进行膨胀,我将在压缩

我使用的是发布在中的gzip代码的思想。 对于初始化,我使用
deflateInit2(p\u strm,Z\u DEFAULT\u COMPRESSION,Z\u DEFLATED,(15+16),8,Z\u DEFAULT\u策略)
。 我在拉一条小溪的拉链。每个数据包都有
Z_FULL_FLUSH
,但最后一个数据包除外,我使用
Z_FINISH
。 在压缩每个数据包之后,我将对数据包重新排序

数据包中的数据-->[zip]-->[reordering]-->

如果我在压缩后对数据进行膨胀,我将在压缩前得到准确的文件。
如果我在数据包重新排序后对数据进行充气(同样:每个数据包都会使用
Z_FULL_FLUSH
,除了最后一个
Z_FINISH
)进行放气),我会得到一个与压缩前的原始文件非常相似的文件。区别在于文件的末尾:缺少字节。这是因为当我将其充气时,最后一个数据包出现错误(
Z_DATA_error
)。如果我使用50KB的块进行膨胀,重新排序后膨胀的文件与输入的文件相同,lessGZip是一个流协议。压缩取决于流的先前历史。您不能对其重新排序。

GZip是一种流协议。压缩取决于流的先前历史。您无法对其重新排序。

由于您使用的是在每次刷新时擦除历史记录的
Z_FULL_FLUSH
,因此您可以对数据包重新排序,但最后一个数据包除外。您完成的
Z_FINISH
必须是最后一个数据包。但它不需要任何数据。您可以使用
Z_FULL_FLUSH
从上一个数据包中输入所有数据,然后在没有输入数据和
Z_FINISH
的情况下执行最后一个数据包。这将允许您在空数据包之前重新排序数据包。总是在最后一个

原因是deflate格式是自终止的,因此最后一个片段标记流的结束。如果你把它重新排列到中间的某个地方,那么当它碰到那个包时,通货膨胀就会停止

gzip报头和尾部需要在开始和结束时进行维护,尾部中的CRC也需要相应地更新。最后的CRC检查取决于数据的顺序


你为什么要做你想做的事?您正在优化什么?

由于您使用的是在每次刷新时擦除历史记录的
Z_FULL_FLUSH
,因此您可以对数据包重新排序,最后一个数据包除外。您完成的
Z_FINISH
必须是最后一个数据包。但它不需要任何数据。您可以使用
Z_FULL_FLUSH
从上一个数据包中输入所有数据,然后在没有输入数据和
Z_FINISH
的情况下执行最后一个数据包。这将允许您在空数据包之前重新排序数据包。总是在最后一个

原因是deflate格式是自终止的,因此最后一个片段标记流的结束。如果你把它重新排列到中间的某个地方,那么当它碰到那个包时,通货膨胀就会停止

gzip报头和尾部需要在开始和结束时进行维护,尾部中的CRC也需要相应地更新。最后的CRC检查取决于数据的顺序


你为什么要做你想做的事?您在优化什么?

是什么给您的印象是zip对数据包重新排序具有弹性?它只起作用,我将文件充气,它就起作用了(充气的最后一块除外)。然后我明白了是Z_FULL_FLUSH负责这项工作……是什么给你的印象是zip对数据包重新排序具有弹性?它只是工作,我对文件进行了充气,它就工作了(除了最后一块充气)。然后我了解到,
Z_FULL_FLUSH
负责它……在这种情况下,您可以重新排序它。
Z_FULL_FLUSH
的目的是在流中提供断点。在这种情况下,您可以对其重新排序。
Z_FULL_FLUSH
的目的是在流中提供断点。谢谢,实际上我没有重新排序最后一个数据包(忘了写那个)。我还尝试用
Z_FULL_FLUSH
发送所有数据包,然后发送最后一个数据(0个输入数据,10个gzip数据的输出开销)-但它也不起作用:\…我正在对数据包进行重新排序以进行优化。所以理论上我似乎没有做错任何事情,不是吗?我不会重新订购第一个/最后一个包。我之前提供的信息是否有助于我理解CRC/last
gzip
标题中的某些内容不好?(输入文件和膨胀的输出文件是相同的,只是后者末尾有一些字节。字节数由我尝试膨胀的块的大小决定)。对不起,这不完全是优化。我从另一个组件获取的每个数据包的顺序与我想要发送的顺序不同,因此我按照我想要的顺序对其重新排序。首先使用
-15
for
windowBits
使其与原始deflate一起工作。那你就不用担心CRC了。然后,如果您在
Z_FULL_FLUSH
之后正确地从
deflate()
提取所有字节(您需要继续调用
deflate()
,直到它返回
stream_avail!=0
),则应再次使用
inflateInit2()中的
-15
对除最后一个数据包之外的数据包重新排序
。谢谢!当我能告诉你它是否有效时,我会尝试一下。谢谢,实际上我没有重新排序最后一个包(忘了写那个)。我还尝试用
Z_FULL_FLUSH
发送所有数据包,然后发送最后一个数据(0个输入数据,10个gzip数据的输出开销)-但它也不起作用:\…我正在对数据包进行重新排序以进行优化。所以理论上我似乎没有做错任何事情,不是吗?我不会重新订购第一个/最后一个包。我以前提供的信息是否有助于我理解