【问题标题】:Deflate algorithm different result with different software用不同的软件放气算法不同的结果
【发布时间】:2021-02-04 04:55:39
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java zip deflate


    【解决方案1】:

    同一个数据有很多很多的deflate表示。您肯定已经注意到您可以设置压缩级别。如果有不同的方法来压缩相同的数据,那只会产生影响。您获得的内容取决于压缩级别、任何其他压缩设置、您使用的软件以及该软件的版本。

    唯一的保证是,当您压缩然后解压缩时,您会得到与开始时完全相同的内容。没有保证,也不需要或不应该保证,当你解压缩然后压缩时,你会得到同样的东西。

    你为什么有这个目标?

    【讨论】:

    • 目标纯粹是教育性的。我只是认为结果应该是一样的,现在我知道它不必如此。
    • 我尝试的另一件事是对使用 WinRar 或 7-Zip 压缩的数据使用 Java 的 zlib 膨胀方法,但它不起作用。似乎它仅适用于以前也使用 zlib 的 deflate 方法压缩的数据。所以我不能确定某种解压方法是否适用于压缩数据的所有各种表示?
    • 您是否仅从 zip 文件中提取 deflate 数据,并在 Java 中使用 raw inflate?
    • 是的,我从放气数据开始的偏移量开始并在预告片之前结束。
    • Raw deflate 意味着对压缩后的数据进行放气,没有标头或尾标。如果您尝试膨胀 zlib 或 gzip 数据,则只能获得“不正确的标头检查”。您需要使用 inflateInit2() 请求原始通胀,以不查找标头。
    【解决方案2】:

    原因是 Deflate 是一种格式,而不是算法。压缩分两步进行:LZ77(在这里,您可以在准无穷大的可能算法中选择多种算法)。然后,LZ77 消息使用 Huffman 树进行编码(同样有大量关于如何定义这些树的选择)。此外,不时在 LZ77 消息流中,重新定义树并开始一个新块是好的 - 或者不。这里再次有大量关于如何分割这些块的选择。

    【讨论】:

    • 这是有道理的。那么解压方式也能重建原始文件,即使它们都表示不同?
    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 2013-04-20
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多