2015-09-26 63 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