0

私はこのコードを持っています:

MemoryStream recChunk = new MemoryStream();
byte[] sizeChunkB = new byte[10];
int sizeChunk;
streamLigacao.Read(sizeChunkB, 0, sizeChunkB.Length);
sizeChunk = BitConverter.ToInt32(sizeChunkB, 0);

int timesToEnter = (int)Math.Ceiling(sizeChunk / 1024.0);

for (int i = 0; i < vezesaEntrar; i++) {
    int size = streamLigacao.Read(RecData, 0, RecData.Length);
    recChunk.Write(RecData, 0, size);
}
recChunk.Position = 0;
MemoryStream deCompressed = new MemoryStream();

using (var tmp = new SevenZipExtractor(recChunk)) {   
    tmp.ExtractFile(0, deCompressed);
}
recChunk.Close();

そして、このエラーを返しています:

ストリームが無効であるか、対応する署名が見つかりませんでした。

STREAAMLIGACAO はネットワークストリームです

私は何を間違っていますか?

4

1 に答える 1

0

コードには多くの問題があります。最も重要なこと:

  • Read読み取ったバイト数を返します。それを無視すると、読んだ以上のことを書いていることになり、問題が発生します。
  • ストリームは自動的に「リセット」されません -recChunk最後にあるので、それを読んでいる人はすぐに終了します。あなたはrecChunk.Position = 0;最初にしなければなりません。
  • (int)Math.Ceiling(sizeChunk / 1024.0)十分に正確でない場合があります。浮動小数点を使用するのではなく、整数の数学にとどまることを本当に望んでいます。
  • さらに、1024 の整数倍ではない値を期待していることを示していますがRecData.Length * timesToEnter、データの正確なバイト数を読み取る (および書き込む) と想定しています。それは怪しいです。

どのデータが含まれているかは明確ではありませんrecChunk-選択した解凍ライブラリによって理解される有効な圧縮バイトストリームであると想定しています。

編集:

入力ストリームは TCP ストリームであるため、上記のすべてがさらに重要になります。より良い読み書きループは次のようになります。

var remainingBytes = sizeChunk;
var buffer = new byte[4096];

while (remainingBytes > 0)
{
  var bytesRead = streamLigacao.Read(buffer, 0, buffer.Length);
  if (bytesRead == 0) throw new InvalidOperationException("Connection closed.");

  recChunk.Write(buffer, 0, bytesRead);
}
于 2016-04-04T09:50:29.023 に答える