【问题标题】:How to read file bytes from byte offset?如何从字节偏移中读取文件字节?
【发布时间】:2020-05-08 09:32:22
【问题描述】:

如果给我一个.cmp 文件和一个字节偏移量0x598,我如何从这个偏移量读取文件?

我当然可以像这样读取文件字节

byte[] fileBytes = File.ReadAllBytes("upgradefile.cmp");

但是我如何从字节偏移0x598读取它

为了解释更多,实际上我必须从这个偏移量开始读取实际数据,在这个字节偏移量之前它只是头数据,所以基本上我必须从那个偏移量读取文件直到结束。

【问题讨论】:

  • FileStream.Seek + FileStream.Read(或.ReadSync()
  • @Jimi - 实际上我对 byte offset 这个词感到困惑,因为 seek 期望位置以 long 类型传递,所以它会根据字节寻找位置吗?
  • 您的偏移量是0x598。这就是您传递给Seek() 方法的内容。当然是指定SeekOrigin.Begin
  • 微软为我们提供了大部分 .NET 的源代码。您可以查看File.ReadAllBytes 是如何实现的,获取该代码,然后随意更改它。

标签: c#


【解决方案1】:

试试这样的代码:

    using (BinaryReader reader = new BinaryReader(File.Open("upgradefile.cmp", FileMode.Open)))
        {
            long offset = 0x598;
            if (reader.BaseStream.Length > offset)
            {
                reader.BaseStream.Seek(offset, SeekOrigin.Begin);
                byte[]fileBytes =  reader.ReadBytes((int) (reader.BaseStream.Length - offset));
            }
        }

【讨论】:

    【解决方案2】:

    如果您不熟悉 Streams、Linq 或其他什么,我为您提供了最简单的解决方案:

    将整个文件读入内存(希望你处理小文件):

    byte[] fileBytes = File.ReadAllBytes("upgradefile.cmp");
    

    计算给定偏移后数组中有多少字节:

    long startOffset = 0x598; // this is just hexadecimal representation for human, it can be decimal or whatever
    long howManyBytesToRead = fileBytes.Length - startOffset;
    

    然后将数据复制到新数组中:

    byte[] newArray = new byte[howManyBytesToRead];
    
    long pos = 0;
    
    for (int i = startOffset; i < fileBytes.Length; i++)
    {
        newArray[pos] = fileBytes[i];
        pos = pos + 1;
    }
    

    如果您了解它的工作原理,您可以查看 Microsoft 文档中的 Array.Copy 方法。

    【讨论】:

      【解决方案3】:

      不使用 ReadAllBytes。

      获取流,移动到药水,读取其余文件。

      您基本上抱怨一种允许单行读取整个文件的便捷方法不是您想要的 - 忽略它只是一种便捷方法。处理文件的常规方法是打开它们并使用 Stream。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-02
        相关资源
        最近更新 更多