2012-03-17 69 views
1

我正在編寫一個C#串行接口,用於我正在處理的FPGA項目,並且遇到了問題。我需要一次讀取文件的16個字節,發送16個字節,然後在正確接收發送下一個16個字節等。一次讀取一個文件16字節問題

在調試雖然我得到錯誤但是與讀取文件:

*(偏移量和長度超出數組範圍或計數大於從索引到源集合末尾的元素數量。)

該文件約爲1200字節,並且錯誤發生在第二個程序嘗試讀取16個字節(即文件的字節16-31)。

任何想法?用錯誤的方法來計算偏移量?我與高層次的編程經驗的無比,所以你幫助將是非常讚賞

問候, 邁克爾

 ///////////////////// Get file data /////////////////// 
     else if (fileDataSent == false) 
     { 
      FileStream fs = File.OpenRead(tbFileToSend.Text); 
      try 
      { 
       byte[] readBytes = new byte[16]; 
       fs.Read(readBytes, nextReadOffset, 16); 
       fs.Close(); 
       for (int j = 0; j < 16; j++) 
       { 
        sendData[j + 3] = readBytes[j]; 
       } 
      } 
      finally 
      { 
       fs.Close(); 
      } 
      nextReadOffset = nextReadOffset + 16; 
      dataBytesSent = dataBytesSent + 16; 
      sendData[0] = Convert.ToByte("10000001", 2); 
      sendData[1] = ByteID; 
      sendData[2] = Convert.ToByte("11000011", 2); 
      sendData[19] = Convert.ToByte("11100111", 2); 
      ByteID++; 
      if (dataBytesSent == WriteFileSize) 
      { 
       fileDataSent = true; 
      } 
     } 

回答

0

Read從流中當前位置讀取(打開流時爲零)。第二個參數是接收數組中的偏移量,而不是流中的偏移量。使用Seek在讀取前設置當前位置。

讀取和複製代碼,我會改寫:

using (FileStream fs = File.OpenRead(tbFileToSend.Text)) 
{ 
    byte[] readBytes = new byte[16]; 
    fs.Seek(nextReadOffset, SeekOrigin.Begin); 
    fs.Read(readBytes, 0, 16); 

    readBytes.CopyTo(sendData, 3); 
} 
+0

謝謝你們,非常感謝。 這是否意味着我每次打開流:(FileStream fs = File.OpenRead(tbFileToSend.Text);)文件指針將默認爲零? 此外,在EOF情況下,字節數<16。readBytes []是否只填滿零,沒有要讀取的數據?或者我會得到某種錯誤? – TheEngineerer 2012-03-17 11:12:42

+0

@ MichaelAlllen771根據[文檔](http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx),「Read」返回實際讀取的字節數(因此實際複製到目標數組中),這可能比請求的字節數少,如果沒有更多的話。請參閱備註部分。 – GSerg 2012-03-17 11:16:26

0

在fs.Read偏移量()被認爲是目標數組中要偏移。在你的情況下,它總是0.文件指針隨着每次Read()調用而增加,所以你不必擔心這一點。但是,您應該考慮沒有剩餘16個字節用於讀取的情況(Read()的返回值)。

+0

謝謝你們,非常感謝。 這是否意味着我每次打開流:(FileStream fs = File.OpenRead(tbFileToSend.Text);)文件指針將默認爲零? 此外,在EOF情況下,字節數<16。readBytes []是否只填滿零,沒有要讀取的數據?或者我會得到某種錯誤? – TheEngineerer 2012-03-17 11:12:50

+0

謝謝你,在stackoverflow上你們是救星! – TheEngineerer 2012-03-17 11:20:53

0

您是從Stream閱讀,這意味着一旦你讀的東西開始點移動到最後一個字節的當前位置=位置您已經閱讀+ 1.

下一次你讀到你從那裏開始。您不需要指定偏移量。事實上,你這樣做是跳過字節。

在你的情況下,你正試圖從文件中不存在的位置讀取數據。

所以這會做得很好:

var numberOfBytesActuallyRead = fs.Read(readBytes, 0, 16); 

numberOfBytesActuallyRead告訴你有多少字節在Stream實際上離開了。然後您可以決定如何繼續。沒有定義索引>(numberOfBytesActuallyRead -1)的值爲readBytes的數組的狀態。它可能是零或你的舊值。

+0

謝謝你們,非常感謝。 這是否意味着我每次打開流:(FileStream fs = File.OpenRead(tbFileToSend.Text);)文件指針將默認爲零? 此外,在EOF情況下,字節數<16。readBytes []是否只填滿零,沒有要讀取的數據?或者我會得到某種錯誤? – TheEngineerer 2012-03-17 11:12:28

+0

@ MichaelAlllen771關於返回的數組,其索引值大於實際讀取的字節的值的狀態未定義,它可能仍然是舊值或零或完全不同的值 – ntziolis 2012-03-17 11:24:51

+0

謝謝,我會花一些時間在調試驗證返回數組的內容。非常感激。 – TheEngineerer 2012-03-17 11:31:59

相關問題