Ошибка: поток неверен или не найдена соответствующая подпись
У меня есть этот код:
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 ответ
Решение
Есть много проблем с вашим кодом. Самое главное:
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);
}