Согласно MSDN в .Net 4.5 System.IO.Compression основан на zlib.
Я пытаюсь теперь изменить текущее чтение на основе interop из потока сгенерированного zlib с не .NET-сервера в реализацию на основе BCL.
Моя реализация выглядит следующим образом:.Net zlib inflate with .Net 4.5
var enc = new UTF8Encoding();
var readBytes = BufferSizeRaw;
var outputBuffer = new byte[BufferSizeRaw];
var networkBuffer = _networkQueue.Take();
var ms = new MemoryStream(networkBuffer.InputBuffer, 0, networkBuffer.UsedLength);
using (Stream stream = new DeflateStream(ms, CompressionMode.Decompress))
while (readBytes==BufferSizeRaw)
{
readBytes = stream.Read(outputBuffer, 0, outputBuffer.Length);
stringBuffer+= enc.GetString(outputBuffer, 0, readBytes);
}
Я получаю следующее исключение на первом вызове декомпрессию/чтения на DeflateStream:
Длина блока не совпадает с его дополнением
Взаимодействующий вызов использует var result=inflate(ref zStyream, ZLibFlush.NoFlush;
Кто-нибудь пробовал то же самое r видит причину ошибки в коде или есть неправильное понимание на моем конце? Я также пробовал его с усечением первых двух байтов без везения.
Первые несколько байтов - 20, 202, 177,13.
Был еще ошибка в моей программе, которую я уже устранили, и он работает в настоящее , Я понимаю, что с версии 4.5 используется двоичная zlib-версия, что является фоном, почему я сделал переключатель. Раньше я использовал родную версию по соображениям производительности. – weismat
Нужно исправить себя - он работает только для нескольких чтений - скорее всего, это связано с потоком памяти. Изучит его дальше. – weismat
Пока они наконец-то переключились на использование zlib в 4.5, который зафиксировал кучу действительно проблем с мозгом, интерфейс к zlib перепутался, и они не будут исправлять его. Поэтому я рекомендую вернуться к родному или использовать DotNetZip. –