zlib фактически может записывать данные в формате gzip в буфер в памяти.
Эта запись zlib faq относится к комментариям в zlib.h. В заголовочном файле в комментарии для deflateInit2 () упоминается, что вы должны (произвольно?) Добавить 16 к 4-му параметру (windowBits), чтобы библиотека форматировала поток deflate в формате gzip (вместо значения по умолчанию "zlib "формат).
Этот код правильно устанавливает состояние zlib для кодирования gzip в буфер:
#include <zlib.h>
z_stream stream;
stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.opaque = Z_NULL;
int level = Z_DEFAULT_COMPRESSION;
int method = Z_DEFLATED; /* mandatory */
int windowBits = 15 + 16; /* 15 is default as if deflateInit */
/* were used, add 16 to enable gzip format */
int memLevel = 8; /* default */
int strategy = Z_DEFAULT_STRATEGY;
if(deflateInit2(&stream, level, method, windowBits, memLevel, strategy) != Z_OK)
{
fprintf(stderr, "deflateInit failed\n");
exit(EXIT_FAILURE);
}
/* now use the deflate function as usual to gzip compress */
/* from one buffer to another. */
Я подтвердил, что эта процедура выдает тот же двоичный вывод, что и интерфейс gzopen / gzwrite / gzclose.