假设我有两个文件,(名称)。n
。rar和(名称)。n+1
。rar,它们似乎是同一组的一部分(相同大小等)。有没有简单的方法来判断他们是否实际同一组的一部分,而没有先下载全套?目前我唯一可以判断的方法是下载每个文件的实例,然后查看当我尝试打开它时WinRAR是否给我一个错误。
(并且在相关的说明中,假设有这样的方法,我可以在没有相邻部分的情况下做同样的事情吗?)
理想情况下,现有程序可以执行此操作,但如有必要,我可以编写自己的代码。
附加说明:这是同一档案的两套档案。它们看起来与明显的检查相同:文件名是后续的,内容是合理的,大小是相同的,相同数量的部分。然后我收到一整套文件。如果它们不是来自同一组,我就不能解开它们 - 虽然看起来WinRAR会在给我CRC错误(文件损坏)之前进行100%。
答案 0 :(得分:1)
我不太熟悉RAR格式,但如果您决定用Java编写程序,我建议使用7-Zip-JBinding。
您可以下载存档的前n + 1个部分,然后调用extract()
方法忽略仅关注
IArchiveExtractCallback.setOperationResult(ExtractOperationResult)
调用(检查CRC是否正常)和监视文件是否已打开
IArchiveOpenVolumeCallback.getStream(java.lang.String)
如果请求卷n + 2,则可以断定卷n + 1是正确的卷。 (我不是100%肯定这个结论,但我会尝试一下)
答案 1 :(得分:1)
所有测试均使用 WinRAR 5.01 32位进行。由于algorythm应保持不变,因此以下语句应对任何其他先前版本有效。如果您知道这不是真的,请随意发表评论。
我将简要介绍一下聊天情况。我试着多次打包大于1GB的文件;然后我混淆了文件并试图提取档案:它有效。问题不在于文件的大小。
我想到了问题的三种可能解决方案:
我对第一个问题最感兴趣:架构能否在包装过程中流入?
我发现答案是是,确实如此。以下是重复实验的段落:
使用 Intel i7-3632QM 和 AMD 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尚未完全压缩,我的第四个文件将以其名称开头。
我希望很清楚,我尽量保持简单。在更多文件的情况下,我将从最后一个存档开始。我写下了在该文件中找到的第一个文件名,我将在前一个文件中搜索它。如果我找到了这个名字,我会重复这个序列直到第一个档案。