Я сталкивался с той же проблемой, другая версия zlib (1.2.7)
Я не знаю, почему inflateInit2 () закомментирован.
Без вызова inflateInit2 вы можете сделать следующее:
err = inflateInit(&d_stream);
err = inflateReset2(&d_stream, 31);
inflateReset2 также вызывается inflateInit. Внутри inflateInit WindowBits установлены на 15 (1111 двоичных). Но вы должны установить их на 31 (11111), чтобы заставить работать gzip.
Причина здесь:
внутри inflateReset2 делается следующее:
wrap = (windowBits >> 4) + 1;
, что приводит к 1, если биты окна установлены 15 (1111 двоичный), и к 2, если биты окна установлены 31 (11111)
Теперь, если вы вызываете inflate (), следующая строка в состоянии HEAD проверяет значение состояния-> wrap вместе с магическим числом для gzip
if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */
Итак, с помощью следующего кода я смог выполнить распаковку gzip в памяти:
(Примечание: этот код предполагает, что полные данные для распаковки находятся в памяти и что буфер для распакованных данных достаточно большой)
int err;
z_stream d_stream; // decompression stream
d_stream.zalloc = (alloc_func)0;
d_stream.zfree = (free_func)0;
d_stream.opaque = (voidpf)0;
d_stream.next_in = deflated; // where deflated is a pointer the the compressed data buffer
d_stream.avail_in = deflatedLen; // where deflatedLen is the length of the compressed data
d_stream.next_out = inflated; // where inflated is a pointer to the resulting uncompressed data buffer
d_stream.avail_out = inflatedLen; // where inflatedLen is the size of the uncompressed data buffer
err = inflateInit(&d_stream);
err = inflateReset2(&d_stream, 31);
err = inflateEnd(&d_stream);
Просто комментирование в inflateInit2 () является решением проблемы. Здесь вы можете установить WindowBits напрямую