ZLIB расширяет формат заголовка потока

после загрузки ZLIB ver. 1.2.11 и просматривая RFC1951, я пытаюсь использовать функцию ZLIB.inflate следующим образом:

#include "zlib.h"

int iRslt;
unsigned char buffIn[4]={0x4b,4,0,0};
unsigned char buffOut[16];
z_stream zStrm;

  memset(&zStrm, 0, sizeof(zStrm));
  zStrm.zalloc = Z_NULL;
  zStrm.zfree = Z_NULL;
  zStrm.opaque = Z_NULL;
  zStrm.avail_in = 0;
  zStrm.next_in = Z_NULL;
  iRslt = inflateInit(&zStrm);
  if(iRslt != Z_OK) return;

  zStrm.avail_in = sizeof(buffIn);
  zStrm.next_in = buffIn;
  zStrm.avail_out = sizeof(buffOut);
  zStrm.next_out = buffOut;
  iRslt = inflate(&zStrm, Z_NO_FLUSH);
  if(iRslt == Z_DATA_ERROR){//-3
    //why do I end up here with zStrm.msg -> "incorrect header check"?
  }

Мой buffIn содержит заголовок битового потока 011b: BFINAL=1; БТИП=01b; и фиксированный код Хаффмана для символа «a» (0x61), за которым следуют не менее 7 нулевых битов для завершения блока. Очевидно, этого недостаточно; пожалуйста помоги. Спасибо заранее; Боба.


person Boba    schedule 06.02.2021    source источник
comment
Вам не нужен memset().   -  person Mark Adler    schedule 07.02.2021
comment
У вас есть лишний ноль во входных данных. Этот необработанный поток дефляции составляет три байта.   -  person Mark Adler    schedule 07.02.2021
comment
это привычка...   -  person Boba    schedule 07.02.2021


Ответы (1)


Ваш код ищет заголовок потока zlib, как определено в RFC 1950. Он его не находит. Этот RFC определяет заголовок и трейлер zlib, которые обертываются вокруг необработанного потока deflate.

У вас есть необработанный поток дефляции в вашем вопросе. Чтобы декодировать это вместо потока zlib, вам нужно будет использовать inflateInit2() со значением windowBits -15.

person Mark Adler    schedule 07.02.2021
comment
большое спасибо, Марк. Читаю 1950 и проверю после игры. - person Boba; 07.02.2021
comment
Марк, вы решаете; спасибо за быстрый и точный ответ. - person Boba; 08.02.2021