2012-03-17 13 views
1

私は作業中のFPGAプロジェクト用のC#シリアルインターフェイスを作成中です。問題が発生しました。私はしかし、ファイルを読み込むと、エラーを取得していますけれども、私は、デバッグ中にファイルを一度に16バイトずつ読む

.. 16のバイトを送信し、正しい受信時に次の16バイトなど送って、一度ファイルに16のバイトを読んでする必要があります。

*(オフセットと長さが配列の範囲外であるか、または数がソースコレクションの末尾までのインデックスの要素数より多い)

ファイルは約1200バイトで、2番目のファイルでエラーが発生していますプログラムが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ストリームの現在の位置(ストリームを開くとゼロ)から読み込みます。 2番目のパラメータは、受信配列内のオフセットであり、ストリーム内のオフセットではありません。

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);)ファイルポインタがデフォルトでゼロになることを意味しますか? また、bytes <16の場合のEOF状況では、readBytes []は読み取るデータがなかった場合には単にゼロでいっぱいになりますか?それとも、何らかのエラーが発生するでしょうか? – TheEngineerer

+0

@ MichaelAlllen771 [ドキュメント](http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx)に従って、 'Read'は実際に読み込まれたバイト数を返します宛先配列に)、これは何もない場合に要求されたバイト数よりも少なくなることがあります。 「備考」を参照してください。 – GSerg

0

(fs.Readにオフセットをいただければ幸いに役立つので、私は、高レベルのプログラミングと非常に経験の浅いです。あなたの場合、これは常に0になるはずです。ファイルポインタはRead()呼び出しごとにインクリメントしますので、心配する必要はありません。ただし、読み込みに16バイトが残っていない場合(Read()の戻り値)を考慮する必要があります。

+0

ありがとうございました。 これは、ストリームを開くたびに(FileStream fs = File.OpenRead(tbFileToSend.Text);)ファイルポインタがデフォルトでゼロになることを意味しますか? また、bytes <16の場合のEOF状況では、readBytes []は読み取るデータがなかった場合には単にゼロでいっぱいになりますか?それとも、何らかのエラーが発生するでしょうか? – TheEngineerer

+0

ありがとう、あなたたちはstackoverflowの人生保護人です! – TheEngineerer

0

あなたはStreamから読んでいる、それはあなたが最後のバイトのPostion =位置に何か開始点の動きを読んでたら、あなたは+読んだことを意味し1.

次回から読むと、そこから始まります。オフセットを指定する必要はありません。実際にそうすることで、バイトをスキップします。

あなたの場合は、存在しないファイル内の位置から読み込もうとしています。

だから、これはうまく行います。

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

numberOfBytesActuallyReadを実際にStreamに残されたバイト数を示します。続行する方法を決定することができます。インデックスが>(numberOfBytesActuallyRead -1)の値の配列readBytesの状態は定義されていません。それはゼロまたは古い値かもしれません。

+0

ありがとうございました。 これは、ストリームを開くたびに(FileStream fs = File.OpenRead(tbFileToSend.Text);)ファイルポインタがデフォルトでゼロになることを意味しますか? また、bytes <16の場合のEOF状況では、readBytes []は読み取るデータがなかった場合には単にゼロでいっぱいになりますか?それとも、何らかのエラーが発生するでしょうか? – TheEngineerer

+0

@ MichaelAlllen771返された配列に関して、実際に読み込まれるバイト数よりも大きなインデックスの値の状態は定義されていませんが、それでもあなたの古い値またはゼロまたはまったく異なるものがある可能性があります – ntziolis

+0

ありがとう、返された配列の内容を確認します。とても有難い。 – TheEngineerer

関連する問題