Как декодировать заголовок блока deflate из выходного результата сжатия deflate

#zlib #deflate

#zlib #deflate

Вопрос:

Я пытаюсь декодировать биты заголовка на основе выходного байта deflate выходных данных сжатия.

 char a[50] = "Hello";
z_stream defstream;
defstream.zalloc = Z_NULL;
defstream.zfree = Z_NULL;
defstream.opaque = ZNULL;

defstream.avail_in = (uInt)strlen(a) 1;
defstream.next_in = (Bytef *)a;
defstream.avail_out = (uINt)sizeof(b);
defstream.next_out = (Bytef *)b;

deflateInit(amp;defstream, Z_BEST_COMPRESSION);
deflate(amp;defstream, Z_FINISH);
deflateEnd(amp;defstream);

for (int i=0; i<strlen(b); i  ) {
  printf("--- byte[%d]=%hhxn", i, b[i]);
}
  

Результат:

 --- byte[0]=78
--- byte[1]=da
--- byte[2]=f3
  

и так далее.

Я просто хочу понять, какие биты являются заголовком 3-битного блока, как описано в deflate спецификации. Первый бит определяет конечный / BFINAL блока. Следующие два бита определяют BTYPE.

Основываясь на этом результате, 0x78 — первые 3 бита равны 000, что означает BFINAL = 0, BTYPE = 00 / без сжатия. Но мне это кажется неправильным. BTYPE должен указывать либо 01, либо 10.

Я что-то здесь упускаю? Может кто-нибудь, пожалуйста, помочь?

Ссылка: спецификация deflate

Ответ №1:

Вы создаете поток zlib, а не необработанный поток deflate. Таким 78 da образом, это заголовок zlib, а не сжатые данные deflate. Данные deflate начинаются с f3 . Это младшие три бита 011 . Значение low 1 равно BFINAL (это последний блок), а значение 01 BTYPE (исправлены коды Хаффмана).