2015-01-13 96 views
0

我想从二进制文件中读取一个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]; 
    } 
+3

向我们展示'sizeOfBuffer()'的定义。另外,任何你不仅仅使用'Array.Copy()'而不是滚动你自己的字节复制循环的理由?这看起来像是一种非常类似于C的方式,可以通过使用C#习语和库函数来大大简化。 – siride

+0

关于'buf [l] = b [l + 1];' - 为什么要跳过'b'的第一个条目? – Codor

+2

@Codor可能是因为b [0]是deleteTag,我也猜测'sizeOfBuffer()= sizeBf'和55是由1 + 50 + 4构成的。 –

回答

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]; 

除非有更多的处理之后,你没有在你的代码中显示。

+1

执行第一个循环后,'l'为50,使得语句'l

+0

你当然是对的。我会在一秒钟内编辑我的答案。 –

+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在将非常有帮助。

+0

不能使用readbyte !!! –

+0

不好意思?如果您的意思是您不允许使用这些方法,请将其纳入您的问题中。 –

+0

通过回答whit其他表格可以解决我的问题,谢谢 –