【问题标题】:How can I compare files excluding the file header?如何比较不包括文件头的文件?
【发布时间】: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 文件)。
  • ... 等等。如果您想进行“智能”比较,即只忽略时间戳等元数据,您确实必须确切了解每种特定文件格式的工作原理。

标签: c# windows file io header


【解决方案1】:

我认为您想使用 .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);
    }

【讨论】:

  • 我非常感谢您的回答,但如何从偏移量读取并不是我想要的——因为我需要知道从偏移量开始。我一直在网上搜索文件字节结构头和偏移量。我知道这些文件有一个文件系统的标题,我不确定是否有一个额外的标题(我知道 Jpeg 有自己的标题)我怎么知道偏移量,以便我可以从实际内容中拆分标题; filestream 到 byte[] 会得到数组,然后我只需要知道在哪里拆分它。所以我有两部分标题,内容。我将编辑我的问题以澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多