【发布时间】:2015-12-24 06:40:57
【问题描述】:
我知道我可以 MD5 一个完整的文件,这不是我想要做的。
我想获取标题和实际文件内容。
我知道每个文件都有一个标题,然后是内容。我想比较两个文件的实际内容以确定内容是否相同,为此我将在内容上使用简单的 md5。
我的问题是如何将标题与内容分开以便进行计算? - 为了让这一点更清楚,我需要知道偏移量;对于所有文件,它们是相同的还是不同的?如果不同,我如何找到详细信息以便完成此操作。 (我知道漱口,但找不到)。
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
return md5.ComputeHash(SplitContentFromHeader(stream));
}
}
SplitContentFromHeader(stream)
{
.. do the thing and return the shortened stream
}
【问题讨论】:
-
许多类型的文件根本没有标题。对于那些这样做的人,如果不知道它是什么类型的文件,就无法区分标题和内容。在大多数情况下,标题很重要,无论如何都应该包含在比较中。
-
@Harry Johnston ,对于任何具有标题的给定文件,您为什么说它应该被包含在内,我的意思是例如一个图像文件 - 图像本身就是使它相同的原因是不正确的?我是否没有正确地认为标题定义了某些元数据但实际内容(例如文档的文本)如果文本相同,则文件内容真的相同吗?
-
取决于格式。例如,考虑一个可执行文件。标头包含起始地址(和其他关键信息),因此除了标头之外相同的两个可执行文件的行为可能完全不同。旧的 Microsoft Office 格式也是如此。您可以将两个不相关的文档放入一个文件中,并且标题将确定您阅读的是哪一个。我想您可以通过更改标题中的版本号来破坏 GIF 文件;您绝对可以通过更改标题信息来破坏 ZIP 文件(包括现代 Microsoft Office 文件)。
-
... 等等。如果您想进行“智能”比较,即只忽略时间戳等元数据,您确实必须确切了解每种特定文件格式的工作原理。