放气算法不同的软件结果不同
Deflate algorithm different result with different software
我目前正在阅读有关 deflate 算法的信息,作为学习的一部分,我选择了一个使用不同方法压缩的文件。我发现并且让我非常困惑的是,不同的方法产生了代表压缩文件的不同字节。
我尝试使用 WinRar、7-Zip、Java zlib 库(ZipOutputStream
class) 压缩文件,也尝试通过对源数据进行压缩来手动压缩文件(Deflater
class)。这四种方法都产生了完全不同的字节。
我的目标只是看到所有方法都生成相同的字节数组作为结果,但事实并非如此,我的问题是为什么会这样?我通过检查文件头来确定所有这些软件实际上都使用了 deflate 算法。
有人可以帮忙吗?是否有可能deflate算法对完全相同的源文件产生不同的压缩结果?
原因是Deflate是一种格式,而不是算法。压缩分两步进行:LZ77(在这里您可以在几乎无限可能的算法中选择大量算法)。然后,LZ77 消息用霍夫曼树编码(同样有大量关于如何定义这些树的选择)。此外,有时在 LZ77 消息流中,重新定义树并开始一个新块是很好的——或者不。关于如何拆分这些块,这里又存在大量选择。
同一数据有很多很多压缩表示。您肯定已经注意到可以设置压缩级别。如果有不同的方法来压缩相同的数据,那只会产生影响。您获得的内容取决于压缩级别、任何其他压缩设置、您使用的软件以及该软件的版本。
唯一的保证是当您压缩然后解压时,您得到的正是您开始时的内容。不能保证,也不需要或不应该保证解压缩然后压缩时得到相同的东西。
你为什么会有那个目标?
我目前正在阅读有关 deflate 算法的信息,作为学习的一部分,我选择了一个使用不同方法压缩的文件。我发现并且让我非常困惑的是,不同的方法产生了代表压缩文件的不同字节。
我尝试使用 WinRar、7-Zip、Java zlib 库(ZipOutputStream
class) 压缩文件,也尝试通过对源数据进行压缩来手动压缩文件(Deflater
class)。这四种方法都产生了完全不同的字节。
我的目标只是看到所有方法都生成相同的字节数组作为结果,但事实并非如此,我的问题是为什么会这样?我通过检查文件头来确定所有这些软件实际上都使用了 deflate 算法。
有人可以帮忙吗?是否有可能deflate算法对完全相同的源文件产生不同的压缩结果?
原因是Deflate是一种格式,而不是算法。压缩分两步进行:LZ77(在这里您可以在几乎无限可能的算法中选择大量算法)。然后,LZ77 消息用霍夫曼树编码(同样有大量关于如何定义这些树的选择)。此外,有时在 LZ77 消息流中,重新定义树并开始一个新块是很好的——或者不。关于如何拆分这些块,这里又存在大量选择。
同一数据有很多很多压缩表示。您肯定已经注意到可以设置压缩级别。如果有不同的方法来压缩相同的数据,那只会产生影响。您获得的内容取决于压缩级别、任何其他压缩设置、您使用的软件以及该软件的版本。
唯一的保证是当您压缩然后解压时,您得到的正是您开始时的内容。不能保证,也不需要或不应该保证解压缩然后压缩时得到相同的东西。
你为什么会有那个目标?