настроить zlib для генерации сжатых данных

У меня вопрос об использовании библиотеки zlib для сжатия данных. Я хочу настроить zlib (а именно функцию deflateInit) таким образом, чтобы сжатые данные были двоичными, равными данным, сгенерированным командой: gzip -9. Это возможно? заранее спасибо


person akasi    schedule 07.12.2012    source источник


Ответы (2)


Значение по умолчанию для аргумента windowsBits - 15.
Если добавить к нему 16, получится 31.
15 | 16 возвращает 31.

z_stream strm;
unsigned char* in = DATA TO COMPRESS;

strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.next_in = in;

int windowsBits = 15;
int GZIP_ENCODING = 16;

deflateInit2 (&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
              windowsBits | GZIP_ENCODING,
              8,
              Z_DEFAULT_STRATEGY));

http://www.lemoda.net/c/zlib-open-write/index.html

person Community    schedule 05.03.2014

Вы не можете получить тот же результат, что и gzip. Однако вы можете получить вывод, совместимый с gzip, так что gzip сможет его распаковать. Вам нужно использовать deflateInit2().

person Mark Adler    schedule 07.12.2012
comment
Я борюсь с той же проблемой. Я нашел FAQ по zlib (по-видимому, написанный вами), в котором объясняется то же решение - используйте deflateInit2 (). Однако, основываясь на обширной документации по deflateInit2, мне все еще не очевидно, как запросить zlib для создания данных, совместимых с gzip. «стратегия» кажется наиболее вероятным параметром для настройки. Не могли бы вы уточнить пожалуйста? Я также попытался создать заголовок и нижний колонтитул gzip, но мне не удалось обмануть 'gunzip'. - person Multimedia Mike; 13.01.2013
comment
Документация находится в zlib.h. Вы это читаете? Все написано на простом английском. В разделе deflateInit2 сказано: windowBits также может быть больше 15 для необязательной кодировки gzip. Добавьте 16 к windowBits, чтобы написать простой заголовок и трейлер gzip вокруг сжатых данных вместо оболочки zlib. - person Mark Adler; 13.01.2013
comment
Хорошо, теперь я это понимаю. Итак, если я читаю это исправление, windowBits должно быть между 8-15, с добавлением 16, если его нужно обернуть в gzip. Я попытался вызвать deflateInit2 () с windowBits 15 + 16, но он вернул ошибку потока (-2). Обратите внимание, что программа правильно создает данные zlib с помощью deflateInit () / deflate (). - person Multimedia Mike; 13.01.2013
comment
Пожалуйста, разместите вопрос со своим кодом. Есть много причин для возврата Z_STREAM_ERROR. - person Mark Adler; 13.01.2013
comment
Спасибо за вашу помощь и терпение. Я собираюсь остановиться на этом еще немного, поскольку в игре много факторов - это малоизвестная встроенная платформа, а SDK, который я использую, имеет довольно старую версию zlib. Я собираюсь попробовать кое-что, например, убедиться, что код работает на современном компьютере с современным zlib, и обновить zlib (+ SDK) на платформе. - person Multimedia Mike; 14.01.2013