如何从deflate压缩输出结果中解码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(&defstream, Z_BEST_COMPRESSION);
deflate(&defstream, Z_FINISH);
deflateEnd(&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

等等

我只是想了解哪些比特是deflate规范中描述的3比特块报头。第一位指定块的最终/BFINAL。接下来的两位指定BTYPE。

基于此结果,0x78-前3位为000,这意味着BFINAL=0,BTYPE=00/无压缩。但这对我来说似乎不正确。BTYPE应该指定01或10。

我是不是错过了什么?有人能帮忙吗?

参考:放气规格

您正在生成一个zlib流,而不是一个原始的deflate流。因此,78 da是zlib头,而不是压缩数据。deflate数据以f3开头。其低三位为CCD_ 5。低1是BFINAL(这是最后一个块(,而01是BTYPE(固定霍夫曼码(。

最新更新