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