如何将二进制文件读入字节数组?

时间:2010-11-26 05:08:09

标签: c# .net file

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

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

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

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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

您可以使用FileInfo类中的Length属性来确定总字节数,以便您也可以计算最后一条记录的字节数。
因此,您可以保留当前的大部分逻辑。

答案 2 :(得分:1)

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

您可以明确地在标题中添加此信息,然后您的代码将在我的想法中充当魅力。

答案 3 :(得分:0)

我不是.net家伙,但看起来你有几个选择。必须有一种方法来告诉文件的大小。如果你能找到,你可以阅读所有内容。或者,binaryreader.readbytes()的msdn描述说如果你要求mroe而不是流包含你将获得文件中的任何内容。你知道你正在读的blob的最大尺寸吗?如果是这样,只需将其读入预先清除的内存中。