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



我有这个代码:

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

它返回这个错误:

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

STREAMLIGAAO是一个网络流

我做错了什么?

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

  • Read返回读取的字节数。如果你忽略了这一点,你写的就比读的多,这会造成麻烦
  • 流不会自动"重置"——recChunk在最后,所以任何从中读取的人都会立即退出。你必须先做recChunk.Position = 0;
  • CCD_ 4可能不够准确。你真的想继续学习整数数学,而不是浮点运算
  • 此外,它表明您期望的值不是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);
}

相关内容

  • 没有找到相关文章

最新更新