2

部分をバイト配列に読み取ってメモリストリームをチャンクに分割しようとしていますが、根本的に間違っていると思います。最初のチャンクを読み取ることができますが、メモリストリームの残りを読み取ろうとすると、読み取るバイトがさらにある場合でも、インデックスが範囲外になります。問題は、メモリストリームと同じ大きさにする必要がある受信バイト バッファのサイズにあるようです。コードは Web サービスにあるため、チャンクに変換する必要があります。

このコードの何が問題なのか誰でも知っています

fb.buffer は MemoryStream です

  long bytesLeft = fb.Buffer.Length;
                fb.Buffer.Position = 0;
                int offset =0;
                int BUFF_SIZE = 8196;


                while (bytesLeft > 0)
                {
                    byte[] fs = new byte[BUFF_SIZE];

                    fb.Buffer.Read(fs, offset, BUFF_SIZE);
                    offset += BUFF_SIZE;
                    bytesLeft -= BUFF_SIZE;
                }
4

2 に答える 2

2

このコードをStream.ReadMSDNから一目で見てください。インクリメントするべきではありませんoffset。常にゼロである必要があります。もちろん、ストリームの正確な長さを事前に知っている場合を除きます(したがって、配列を正確なサイズで作成します)。

Readまた、常に(戻り値)から読み取られたバイト数を取得する必要があります。

それを「チャンク」に分割しようとしている場合、n個の8kチャンクが必要ですか?次に、次のようなことを行うことができます。

List<byte[]> chunks = new List<byte[]>();
byte chunk = new byte[BUFF_SIZE];
int bytesRead = fb.Buffer.Read(chunk, 0, BUFF_SIZE);
while(bytesRead > 0)
{
  if(bytesRead != BUFF_SIZE)
  {
    byte[] tail = new byte[bytesRead];
    Array.Copy(chunk, tail, bytesRead);
    chunk = tail;
  }
  chunks.Add(chunk);
  bytesRead = fb.Buffer.Read(chunk, 0, BUFF_SIZE);
}

特に、最後のチャンクは正確なBUFF_SIZE長さではない可能性が高いことに注意してください。

于 2012-04-16T07:50:48.260 に答える
2

offsetこれは配列へのオフセットです。ここではゼロにする必要があります。からの戻り値も確認する必要がありますRead。より多くのデータが利用可能であっても、バッファがいっぱいになる保証はありません。

ただし、これが - の場合は、データの複製を必要としないMemoryStreamの方が適している可能性があります。ArraySegment<byte>

于 2012-04-16T07:42:58.380 に答える