代码之家  ›  专栏  ›  技术社区  ›  Gerald Davis

如何将二进制文件读取到字节数组中?

  •  1
  • Gerald Davis  · 技术社区  · 14 年前

    我有一个二进制文件,我正在读取一组字节数组。

    该文件包含多个(任意数目)记录。基本上是一个字节块。每条记录的长度是任意的。

    文件头提供每个记录的偏移量。

    record 0: offset 2892
    record 1: offset 4849
    ....
    record 98: offset 328932
    record 99: offset 338498
    

    我已经编写了代码来执行循环,并将每个记录读取到它的字节数组中。查看偏移量的差异可以得出记录大小。查找偏移量,然后调用readbytes()将记录读取到其数组中。

    我目前未完成的解决方案在最后一个记录中无法使用。您将如何将最后一条记录读取到数组中(记住它的长度是任意的)。

    为什么呢?每个记录都是加密的,需要分别解密。我正在写代码,它将把每个记录读入一个字节数组。解密它,然后将所有记录写回一个文件。

    根据要求添加的代码:

        //recordOffsets contain byte location of each record start.  All headers (other than universal header) are contained within record 0.
        recordBlocks = new List<RecordBlock>();
    
        //store all recordOffsets.  Record0 offset will be used to load rest of headers.  Remaining are used to parse text of eBook.
        for (int i = 0; i < standardHeader.numRecs; i++)
        {
            RecordBlock r = new RecordBlock();
            r.offset = bookReader.ReadInt32(EndianReader.Endian.BigEndian);
            r.number = bookReader.ReadInt32(EndianReader.Endian.BigEndian);
            recordBlocks.Add(r);
        }
    
        foreach (RecordBlock r in recordBlocks)
        {
            if (r.number  == recordBlocks.Count)
            {
                ///deal with last record
            }
            else
            {
                r.size = recordBlocks[(r.number) + 1].offset - r.offset;   
            }
            bookReader.Seek(r.offset, SeekOrigin.Begin);
            r.data = bookReader.ReadBytes(r.size);            
        }
    
    4 回复  |  直到 14 年前
        1
  •  3
  •   weismat    14 年前

    您可以使用fileinfo类的length属性来确定字节总数,这样您也可以计算最后一条记录的字节数。
    所以你可以保留你目前的大部分逻辑。

        2
  •  6
  •   Aamir    14 年前

    System.IO.File.ReadAllBytes() 将读取字节数组中的所有字节,然后您可以逐个记录地从该字节数组记录中读取。

        3
  •  1
  •   TalentTuner    14 年前

    你的问题在我看来是 如何获得最后一个记录的实际记录大小。

    您可以将这些信息显式地添加到头中,然后您的代码将在我的思想中发挥魅力。

        4
  •  0
  •   atk    14 年前

    我不是一个.NET的人,但你似乎有几个选择。一定有办法知道文件的大小。如果你能找到它,你就可以阅读一切。或者,binaryreader.readbytes()的msdn描述会说,如果您请求mroe,而流中包含的内容则会得到文件中的任何内容。你知道你读到的那个斑点的最大尺寸吗?如果是这样,只需将其读到预先清除的内存中即可。