Zlib сжатие в формате gzip
Подскажите пожалуйста насчет сжатия библиотекой Zlib данных в формат gzip, а не zlib.
1)Правильно ли я понимаю, что при сжатии в формате gzip - Zlib установить в заголовок gzip размер сжатых данных - размер первоначальных не сжатых данных ? В заголовке же gzip - есть место под размер не сжатых данных ?
Вот тут находил ответ:Чем deflate отличается от gzip?
Вроде пишут, что есть. Но в гугле, что то больше ничего не нашел по полям заголовка gzip. Подскажите пожалуйста.
2)И собственно интересует, как сделать, чтобы Zlib сжимала в формат gzip.
В описании к deflateInit2 написано:
deflateInit2 ((z_streamp strm,
int level,
int method,
int windowBits, //это
int memLevel,
int strategy));
windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no header crc, and the operating system will be set to the appropriate value, if the operating system was determined at compile time. If a gzip stream is being written, strm->adler is a CRC-32 instead of an Adler-32.
windowBits также может быть больше 15 для необязательного кодирования gzip. Добавлять 16 в windowBits, чтобы написать простой gzip-заголовок и трейлер вокруг сжатые данные вместо оболочки zlib. Заголовок gzip не будет иметь имя файла, без дополнительных данных, без комментариев, без времени модификации (установлено на ноль), без заголовок crc, и в операционной системе будет установлено соответствующее значение, если операционная система была определена во время компиляции. Если поток gzip в написанном виде strm->adler — это CRC-32, а не Adler-32.
-Я что то ни как не могу понять, что значит "Добавлять" ?? К чему добавлять ? Каким образом "добавлять" ?
-И возвращаясь к первому вопросу: то есть Zlib сама установить значение заголовка gzip, если ОС будет определена и оставит поля заголовка пустыми, если ОС не была определена ? А как я узнаю была ли определена ОС или нет ? То есть фактически, как я узнаю были ли установлены значения заголовка gzip или нет ?
PS: во общем: проверено:
a.Если сжимать данные с помощью Zlib в формате gzip, то Zlib к СЖАТЫМ данным добавляет в последние 4 байта размер НЕСЖАТЫХ данных.
b.Чтобы сжать данные в формате Gzip c помощью Zlib - нужно вызвать функцию deflateInit2 с параметром windowBits с значением: 15 + 16
deflateInit2(&stream, level, Z_DEFLATED, 15 + 16, 8, Z_DEFAULT_STRATEGY);
Ответы (1 шт):
Gzip состоит из заголовка, тела с дефлате, и контрольной суммы. Заголовок можно лепить один и тот же, например, 1f 8b 08 00 00 00 00 00 00 03.
1f 8b - мэджик
08 - дефлате
нули - FLG|MTIME|XFL
03 - юникс (не имеет значения для бинарных данных)
Указывать размер данных в нем не нужно. Контрольную сумму надо считать во время набивания буфера в дефлате и дописать в конце.
Если хочется указать размер несжатых данных, то он ставится в конце файла после контрольной суммы (ISIZE).
Размер сжатых данных не указывается.