错误:流无效或未找到相应的签名

时间:2016-04-04 09:21:55

标签: c# stream sevenzipsharp

我有这段代码:

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();

它正在返回此错误:

  

该流无效或未找到相应的签名。

     

STREAMLIGACAO是一个网络流

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的代码存在很多问题。最重要的是:

  • Read返回读取的字节数。如果你忽略了这一点,你写的比你读的要多,造成麻烦。
  • Strets不会重置&#34;自动 - 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);
}