Ошибка: поток неверен или не найдена соответствующая подпись

У меня есть этот код:

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);
}
Другие вопросы по тегам