2015-01-13 95 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其他表格可以解決我的問題,謝謝 –