#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 (исправлены коды Хаффмана).