从文件中读取记录

时间:2015-01-13 14:19:04

标签: c#

我试图从二进制文件中读取一条Unicode记录并存储在对象中,但是缓冲区的最后一个字节没有保存,为什么?

b = new byte[55];

file.read(b, 0, b.length)

set(b);

    private static int sizePtr = 4;
    private static int sizeBf = 50;
    private byte deleteTag ;                    
    private byte []buf = new byte[sizeBf];    
    private byte []pointer = new byte[sizePtr];

    public void set( byte[] b) 
    {
        deleteTag = b[0];      
        Int32 l;

        for (l = 0; l < sizeOfBuffer(); l++) 
            buf[l] = b[l+1];

        for (int i = 0; i < sizePtr; i++, l++)
            pointer[i] = b[l];
    }

2 个答案:

答案 0 :(得分:3)

您没有指定具体的用例,但我会说您需要的是BinaryReader类。如果您想要读取包含您知道其结构的数据的二进制文件,这将非常有用。在你的情况下,它可能是这样的:

var br = new BinaryReader(File.OpenRead(filePath));

private static int sizePtr = 4;
private static int sizeBf = 50;
private byte deleteTag ;                    
private byte []buf = new byte[sizeBf];    
private byte []pointer = new byte[sizePtr];

//read deleteTag
deleteTag = br.ReadByte();
buf = br.ReadBytes(sizeBf);
pointer = br.ReadBytes(sizePtr);

如果您的指针是4字节整数值,您也可以这样做:

pointer = br.ReadUInt32();

因此,如果您的二进制文件非常复杂,那么binaryReader将非常​​有用。

答案 1 :(得分:1)

第一个循环的最后一次执行有l=49(假设sizeofBuffer()只返回sizeBf),这使得

buf[49] = b[50]

之后,第二个循环的第一次执行有l=50,这使你的代码执行

pointer[0] = b[50]

然后该循环的最后一次执行将是

pointer[3] = b[53]

鉴于此,您正在丢失最后一个字节。我建议将第二个循环更改为

for (int i = 0; i < sizePtr; i++, l++)
    pointer[i] = b[l+1];

除非您的代码中没有显示更多处理。