重新创建的 LZMA 在 332 字节后与原始 LZMA 不同 - 可能吗?

Posted

技术标签:

【中文标题】重新创建的 LZMA 在 332 字节后与原始 LZMA 不同 - 可能吗?【英文标题】:Recreated LZMA differs from the original after 332 bytes - possible? 【发布时间】:2019-07-21 19:33:00 【问题描述】:

今天遇到了一个 LZMA 压缩文件,被LZMA SDK 识别并解压。我的解压参数是lc = lp = 0, pb = 2,字典大小为 8MB。

当我重新压缩它时(没有修改,使用相同的上述参数):

我得到的前 332 个字节与原始压缩数据的相同 从第 333 个开始,我没有发现任何共同的重要字节序列 重新创建的 LZMA 比原始 LZMA 小 1 个字节 我能够再次解压缩它以从原始文件中解压缩相同的文件

我想要的是完全按原样重新创建原始 LZMA,因为我担心我从中获取原始 LZMA 的固件可能无法识别重新创建的 LZMA。

我可以使用任何信息或提示来说明为什么两个 LZMA 文件中的前 332 个字节相同,而其余的则不同。我试图找到一些压缩参数,除了我提到的 4 个之外,只有输出 after 特定偏移量可能会受到影响(我假设 LZMA 解压缩具有相同的参数是单射的,如果我在这里错了,请纠正我)。没有找到任何组合,有太多组合可以尝试。

我认为只有在我的情况不常见时才需要引用原始文件。在这种情况下,请告诉我,我会创建一个链接。

不胜感激。

【问题讨论】:

【参考方案1】:

参数 lc、lp、pb 和字典大小决定了 LZMA 的不同子格式。 只有使用这 4 个参数的正确值,才能正确解压缩压缩文件。 然而,考虑到这些参数,使用 LZMA 压缩数据的方法有很多。

LZ77 字符串匹配器算法有很多种,每一种都有很多变体和参数。 即使 LZ77 相位的给定输出,也有多种替代方法可以将其编码为 LZMA 格式。

因此,即使使用相同的参数,压缩文件也可能不同,具体取决于用于压缩的算法:不同版本的 LZMA SDK 或不同的 LZMA 编码器。

【讨论】:

您是否知道这些压缩因子中的哪一个(字符串匹配器、版本等)可能会更改大部分输出但不会更改 332 字节的前缀? 332 字节肯定是特定于您的数据的。你没有其他这样的文件吗?现在,很容易看出 LZ77 流在您的两个压缩数据中是否相同:您可以自定义解码器并添加控制台或文本文件输出以显示 LZ77 代码是什么。

以上是关于重新创建的 LZMA 在 332 字节后与原始 LZMA 不同 - 可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用非原始类型重新创建 C++ 联合类型时出现对齐错误

通过重新解释原始字节从一种类型的 numpy 数组转换为另一种类型

加载预训练模型后与可变输入尺寸相关的错误

LeetCode332. 重新安排行程

LeetCode332. 重新安排行程

LeetCode332. 重新安排行程