ZLIB и DEFLATE - это не одно и то же. В RFC IETF определен набор из 3 связанных спецификаций сжатия:
Все они используют (в основном) определенный алгоритм сжатия, который является DEFLATE.
Как ZLIB относится к DEFLATE
Первый, ZLIB, включает кадрирующие байты в начале. Согласно RFC 1950 ...
A zlib stream has the following structure:
0 1
+---+---+
|CMF|FLG| (more-->)
+---+---+
(if FLG.FDICT set)
0 1 2 3
+---+---+---+---+
| DICTID | (more-->)
+---+---+---+---+
+=====================+---+---+---+---+
|...compressed data...| ADLER32 |
+=====================+---+---+---+---+
CMF и FLG - байты. Как сказано в спецификации, метод сжатия primary , используемый в ZLIB, - это DEFLATE, хотя спецификацию можно использовать с другими методами. В общем, это не так. Кроме того, DICTID обычно используется , а не . Поэтому каждый поток ZLIB имеет 2 байта, за которыми следует поток сжатых данных, а затем контрольная сумма Adler32. Сжатые данные представляют собой чистый поток байтов из DEFLATE.
Как GZIP относится к DEFLATE
Это заботится о том, как ZLIB отличается от DEFLATE как формат. GZIP - это третий формат. Если вы хотите узнать подробности, проверьте RFC. Ключевым моментом является то, что, как и ZLIB, GZIP в основном использует DEFLATE и ставит заголовок перед сжатым потоком данных, а затем контрольную сумму. Но заголовок GZIP отличается от заголовка ZLIB, поэтому любой класс GZipStream не сможет записать поток байтов, который будет читаться как ZLIB. И наоборот.
Решение проблемы
Когда читает Поток ZLIB, некоторые люди решают проблему, с которой вы столкнулись , используя встроенный в .NET DeflateStream для потока данных, после продвижения потока после первых двух кадров ZLIB байт. Это работает, пока вы хотите ПРОЧИТАТЬ, поток ZLIB использует DEFLATE (безопасное предположение), и он не определяет фиксированный словарь (также довольно безопасный), и если вам не нужна проверка целостности, предоставляемая Adler32 ( может быть).
Если вам не нравится делать эти предположения или отказываться от проверки, или если вам нужно генерировать поток данных ZLIB, есть ZlibStream в DotNetZip , который будет читать и записывать потоки данных ZLIB для вас, а также проверять или производить контрольную сумму по мере необходимости.
DotNetZip бесплатен, работает с любым языком .NET. Вам не нужна полная библиотека DotNetZip, вместо этого вам просто нужен Ionic.Zlib.dll.