【问题标题】:Determining if two rar files are part of the same set确定两个 rar 文件是否属于同一组
【发布时间】:2014-01-04 21:40:55
【问题描述】:

假设我有两个文件,(name).n.rar 和 (name).n+1.rar,它们似乎是同一组的一部分(相同大小等)。有没有什么简单的方法来判断它们是否实际上是同一集合的一部分,而无需先下载完整集合?目前我能判断的唯一方法是下载每个文件的实例,然后查看 WinRAR 在我尝试解包时是否给我一个错误。

(在相关说明中,假设有这样的方法,我可以在没有相邻部分的情况下做同样的事情吗?)

理想情况下,有一个现有的程序可以做到这一点,但如果需要,我可以自己编写代码。

补充说明:这是同一文件的两组档案。它们看起来与明显的检查相同:文件名是后续的,内容是合理的,大小相同,部分数量相同。然后我会收到一整套文件。如果它们不是来自同一组,我无法解压缩它们 - 尽管 WinRAR 似乎会在给我 CRC 错误(文件损坏)之前进入 100%。

【问题讨论】:

    标签: rar winrar


    【解决方案1】:

    我对 RAR 格式不太熟悉,但如果您决定用 Java 编写程序,我建议您使用 7-Zip-JBinding。

    您可以下载存档的前 n+1 部分,然后调用 extract() 方法忽略输出数据只关心

    IArchiveExtractCallback.setOperationResult(ExtractOperationResult) 
    

    调用(检查 CRC 是否正常)并监控文件是否打开

    IArchiveOpenVolumeCallback.getStream(java.lang.String)
    

    如果请求第 n+2 卷,您可以断定第 n+1 卷是正确的。 (我不是 100% 确定这个结论,但我会试一试)

    【讨论】:

    • 嗯...我让 WinRAR 浏览了整个文件,确定它 100% 完成,然后告诉我文件已损坏 - 我有理由相信这是因为我得到混合部分,而不是因为原始文件已损坏。 (虽然,实际上,那是一个 zip 文件,所以 RAR 可能更合理......)
    • 如果您的存档中有一个大文件,则可能会发生这种情况。但即便如此,只要您传递整个错误的卷,您就会收到 RAR 提取引擎报告的 CRC 错误。
    • 对不起?我不确定我是否理解。
    • 想法是,您只需开始提取过程,将您的卷传递给提取器。传递错误的卷会触发 CRC 错误,您会通过IArchiveExtractCallback.setOperationResult(ExtractOperationResult) 回调得到报告。 100% 确定,您可以将所有卷传递给提取器,并在最后的回调中期待 OK。
    • 哦,我明白了。是的,这可能会奏效——我会试试的。顺便说一句 - CRC 代表什么,你知道吗?
    【解决方案2】:

    新答案

    所有测试均使用 WinRAR 5.01 32 位。由于算法应保持不变,因此以下陈述应适用于任何其他先前版本。如果您知道这不是真的,请随时发表评论。

    我将简要介绍一下聊天。我多次尝试打包大于 1GB 的文件;然后我混合了文件并尝试提取档案:它起作用了。问题不在于文件的大小。

    我想到了三个可能的解决方案:

    1. 架构在打包过程中受到影响:因此不同的人尝试打包文件,将它们混合会导致错误;
    2. 不同的人尝试打包文件,给出的文件大小略有不同(例如 250 MB 和 250000 KB)。不过,这会在文件属性中注意到;
    3. 文件在下载过程中损坏:重新下载它们将证实这一假设。

    我对第一个问题最好奇:架构会影响包装过程吗?

    我发现答案是是的,是的。以下是重复实验的段落:

    1. 在计算机A中将您的文件打包成一个档案,给出精确的部分尺寸;
    2. 在计算机B中打包完全相同的文件,给出完全相同的零件尺寸(TODO: 检查此实验在类似架构下是否仍然有效,例如 Intel i7 和 Intel i5)在不同架构下(例如 Intel 处理器和 AMD 处理器);
    3. 将一个(或多个,如果您愿意,但当然不是全部!)部件从计算机 B 转移到计算机 A。请记住在A 传输之前从计算机中删除这些文件;
    4. 将所有文件放在同一目录下,检查它们是否都具有相同的名称(例如“AAA part1”、“AAA part2”...);
    5. 提取它们;
    6. 享受您的 CRC 错误!

    使用 Intel i7-3632QMAMD FX 6300 进行测试。

    我有一些怀疑,压缩文件是一样的,但是CRC码不一样。


    旧答案

    确实有办法。在我的计算机科学学术学习期间,我们有一个计算机取证课。我了解到每个文件都有一个静态的开头(我们可以说是一个标题),这使程序能够识别它的类型以及解密它的方式。要查看它,您只需使用文本编辑器打开它(我猜 Notepad++ 是迄今为止最好的)

    例如,jpeg 图片以ÿØÿá 开头。

    我尝试将视频存储在一些拆分的 .rar 文件中,但知道它们是否属于同一个存档比我想象的要简单。

    每个 rar 文件都以 Rar! 开头。在第二行或第三行,它应该显示存储在存档中的文件的名称:在我的例子中,myVideo.mp4。如果您的所有档案都包含该文件名,那么它们可能是同一个档案的一部分。

    如果存档中有多个文件并且您不知道它们的名称,情况会变得更糟。其实如果有多个文件,RAR文件结构如下:

    文件 1:

    Rar!
    NUL NUL NUL //Random things here
    NUL NUL NUL NUL NUL myVideo.mp4 NUL NUL NUL NUL
    //Random things here. If the dimensions of the file exceed the archive,
    //the next file will begin with the same name.
    //Let's assume that this is happening.
    EOF
    

    文件 2:

    Rar!
    NUL NUL NUL //Random things here
    NUL NUL myVideo.mp4 NUL NUL NUL
    //This time the file is complete. Since there is still space in the archive,
    //it will add another file
    NUL NUL NUL NUL mySecondVideo.mp4 NUL NUL NUL NUL
    EOF
    

    假设在第二个存档结束时,mySecondVideo 尚未完全压缩。

    文件 3:

    Rar!
    NUL NUL NUL
    NUL NUL NUL NUL mySecondVideo.mp4 NUL
    NUL NUL NUL
    NUL myTextFile.txt
    NUL NUL NUL mySecondTextFile.txt NUL
    EOF
    

    如果 mySecondTextFile.txt 尚未完全压缩,我的第四个文件将以其名称开头。

    我希望它很清楚,我试图让它尽可能简单。如果文件更多,我会从最后一个存档开始。我会记下在该文件中找到的第一个文件名,然后在前一个文件中进行搜索。如果我找到那个名字,我会重复这个序列直到第一个存档。

    【讨论】:

    • 这就是问题所在。假设我有一个 1GB 的大文件。我把它分成了两次,分成两组 250MB 的块。现在我从每组中挑选一件。除非我真的很不走运,否则这是行不通的——我将无法重建文件。但是,列出的文件名在每个文件的开头都是相同的。
    • 我不太明白这个问题。也许我错过了一点。如果将单个 1 GB 文件放入这四个(?)部分中,则每个部分的开头将始终具有相同的文件名。这是最简单的情况,因为您只需要检查每个部分的文件名是否相同。
    • 是的 - 但文件不会以相同的方式拆分两次。如果我将相同的单个 1GB 文件打包成四个部分两次,我每次都不会得到完全相同的文件,如果我在它们之间混合和匹配,我将无法解压缩它们。
    • 好的,我知道了。我会考虑的!
    • 我在解开同一文件的不同集合时没有问题。我想每次零件都按照相同的精确算法进行拆分。我正在使用 WinRAR 5.01 32 位。您是如何压缩和拆分文件的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多