Интересно, может ли кто-нибудь пролить свет на проблему, которая сводит меня с ума:
Я пишу тестовый класс сжатия и декомпрессии. Чтобы проверить это, я сериализую набор данных в поток памяти, сжимаю и распаковываю его и сравниваю результаты.
Со сжатием все в порядке, но с разжатием дело обстоит иначе. Это функция распаковки:
public static Stream GetUncompressedStreamCopy(Stream inStream)
{
Stream outStream = new MemoryStream();
inStream.Position = 0;
DeflateStream uncompressStream = new DeflateStream(inStream,
CompressionMode.Decompress, true);
byte[] buffer = new byte[65536];
int totalread = 0;
int bytesread = 0;
do {
bytesread = uncompressStream.Read(buffer, 0, buffer.Length);
totalread += bytesread;
outStream.Write(buffer, 0, bytesread);
Console.WriteLine("bytesRead: [{0}]\t outStream.Length [{1}]",
bytesread, outStream.Length);
} while (bytesread > 0);
Console.WriteLine("total bytes read [{0}]", totalread);
outStream.Flush();
return outStream;
}
При размере буфера 65536 распакованный поток всегда возвращает на один байт меньше, чем в несжатом виде.
Теперь это подводит меня ко второй проблеме, с которой я борюсь. При некоторых размерах буфера функция uncompressStream.Read возвращает 0, даже если для извлечения еще остались сжатые данные.
В этих случаях deflateStream.Read(s) только один раз в цикле do{}, а затем возвращает несжатый поток, равный размеру буфера, если вы увеличите размер буфера на один байт, все будет хорошо (за исключением отсутствующего байта).
Вывод для размера буфера 65536: (исходные несжатые данные 207833)
bytesRead: [65536] outStream.Length [65536]
bytesRead: [65536] outStream.Length [131072]
bytesRead: [58472] outStream.Length [189544]
bytesRead: [18288] outStream.Length [207832]
bytesRead: [0] outStream.Length [207832]
total bytes read [207832]
размер буфера 189544 (какое-то магическое число, где код танков)
bytesRead: [189544] outStream.Length [189544]
bytesRead: [0] outStream.Length [189544]
total bytes read [189544]
Unompressed stream size 189544
Также обратите внимание на 3-е чтение размера буфера 65536 ex: bytesRead: [58472] Ясно, что это также должно быть 65536, так как в буфере еще остались данные?
Любые идеи будут очень оценены.
Тиа
- Жако