Error: The stream is invalid or no corresponding signature was found
Error: The stream is invalid or no corresponding signature was found
我有这个代码:
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();
它返回此错误:
The stream is invalid or no corresponding signature was found.
STREAMLIGACAO is a networkstream
我做错了什么?
你的代码有很多问题。最重要的是:
Read
returns 读取的字节数。如果你忽略这一点,你写的比读的多,会造成麻烦。
- 流不会 "reset" 自动 -
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);
}
我有这个代码:
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();
它返回此错误:
The stream is invalid or no corresponding signature was found.
STREAMLIGACAO is a networkstream
我做错了什么?
你的代码有很多问题。最重要的是:
Read
returns 读取的字节数。如果你忽略这一点,你写的比读的多,会造成麻烦。- 流不会 "reset" 自动 -
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);
}