Java 放气算法不同,使用不同的软件得出不同的结果

Java 放气算法不同,使用不同的软件得出不同的结果,java,zip,deflate,Java,Zip,Deflate,我目前正在阅读关于deflate算法的文章,作为学习的一部分,我选择了一个使用不同方法压缩的文件。我发现并且让我非常困惑的是,不同的方法产生了表示压缩文件的不同字节 我尝试使用WinRar 7-Zip压缩文件,使用Java zlib库(ZipOutputStreamclass),也尝试手动压缩文件,只需对源数据进行deflate(Deflaterclass)。这四种方法产生的字节完全不同 我的目标只是看到所有的方法都产生了相同的字节数组,但事实并非如此,我的问题是为什么会这样?我通过检查文件头确

我目前正在阅读关于deflate算法的文章,作为学习的一部分,我选择了一个使用不同方法压缩的文件。我发现并且让我非常困惑的是,不同的方法产生了表示压缩文件的不同字节

我尝试使用WinRar 7-Zip压缩文件,使用Java zlib库(
ZipOutputStream
class),也尝试手动压缩文件,只需对源数据进行deflate(
Deflater
class)。这四种方法产生的字节完全不同

我的目标只是看到所有的方法都产生了相同的字节数组,但事实并非如此,我的问题是为什么会这样?我通过检查文件头确保所有软件都使用了deflate算法


有人能帮忙吗?deflate算法是否可能为完全相同的源文件生成不同的压缩结果?

原因是deflate是一种格式,而不是算法。压缩分为两个步骤:LZ77(在这里,您可以在准无限的可能算法中选择大量算法)。然后,LZ77消息用哈夫曼树进行编码(关于如何定义这些树,还有很多选择)。此外,在LZ77消息流中,不时地重新定义树并启动新的块是很好的,不管是否。关于如何分割这些数据块,这里又有大量的选择。

相同数据的deflate表示有很多很多。当然,您已经注意到可以设置压缩级别。只有当有不同的方法压缩相同的数据时,这才会产生效果。您得到的内容取决于压缩级别、任何其他压缩设置、您使用的软件以及该软件的版本

唯一的保证是,当你压缩然后解压缩时,你得到的正是你开始时得到的。没有任何保证,也不需要或应该有这样的保证,当你解压然后再压缩时,你会得到同样的东西


你为什么有这个目标?

这是有道理的。因此,解压方法也能够重建原始文件,即使它们都以不同的方式表示??目标纯粹是教育性的。我只是认为结果应该是一样的,现在我知道不必如此。我尝试过的另一件事是在我使用WinRar或7-Zip压缩的数据上使用Java的zlib充气方法,但它不起作用。似乎它只适用于以前用zlib的deflate方法压缩的数据。因此,我不能确定某种解压方法是否适用于压缩数据的所有各种表示形式?您是否仅从zip文件中提取了放气数据,并使用Java中的原始充气?是的,我从偏移量开始,放气数据在尾部之前开始和结束。原始放气意味着放气压缩数据,没有标题或尾部。如果您试图膨胀zlib或gzip数据,则只能得到“不正确的标题检查”。您需要使用
inflateInit2()
请求原始充气以不查找标题。