我有这段代码:
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是一个网络流
我做错了什么?
答案 0 :(得分:0)
您的代码存在很多问题。最重要的是:
Read
返回读取的字节数。如果你忽略了这一点,你写的比你读的要多,造成麻烦。recChunk
即将结束,因此任何阅读它的人都会立即退出。您必须先recChunk.Position = 0;
。(int)Math.Ceiling(sizeChunk / 1024.0)
可能不够准确。你真的想要使用整数数学,而不是涉及浮点数。 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);
}