2015-09-26 29 views
0

我知道我可以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 
} 
+0

许多类型的文件没有一个头的。对于那些做的,没有办法区分标题和内容而不知道它是什么类型的文件。而且在大多数情况下,标题很重要,无论如何都应该包含在比较中。 –

+0

@哈里约翰斯顿,对于任何给定的文件,有一个标题为什么你会说它应该包括在内,我的意思是例如一个图像文件 - 图像本身是什么使它一样的是不正确的?我没有正确地想到,标题定义了某些元数据,但实际内容(例如文档的文本)如果文本相同,文件内容是否真的相同? – Ken

+0

这取决于格式。例如,考虑一个可执行文件。标题包含起始地址(和其他关键信息),因此与标题相同的两个可执行文件可能表现完全不同。旧的Microsoft Office格式也是如此;您可以将两个不相关的文档放入一个文件中,并且标题将决定您读取哪一个。我想你可以通过更改标题中的版本号来打破GIF文件;您可以通过更改标题信息来打破ZIP文件(包括现代Microsoft Office文件)。 –

回答

0

我想你想使用的.Seek.Read方法。在这里看到的文档:https://msdn.microsoft.com/en-us/library/system.io.filestream.seek(v=vs.110).aspx这里https://msdn.microsoft.com/en-us/library/system.io.stream.read(v=vs.110).aspx

从一个类似的问题在这里复制的尝试Read file from position是这样的:

using (FileStream fs = new FileStream(@"file.txt", FileMode.Open, FileAccess.Read)) 
    { 
     fs.Seek(100, SeekOrigin.Begin); 

     byte[] b = new byte[fs.Length - 100]; 
     fs.Read(b, 0, (int)(fs.Length - 100)); 

     string s = System.Text.Encoding.UTF8.GetString(b); 
    } 
+0

我非常感谢你的回答,但是如何从偏移中读取并不是我正在寻找的内容 - 因为我需要知道偏移量。我一直在寻找文件字节结构头和偏移量。我知道这些文件有一个文件系统的头文件,我不确定是否有额外的头文件(Jpeg,我知道它有自己的头文件),我怎么知道偏移量,以便我可以从实际内容中分割头文件;文件流到byte []会得到数组,然后我只需要知道在哪里分割它。所以我有两个部分标题,内容。我会编辑我的问题来澄清。 – Ken