我正在尝试根据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]=%hhx\n", i, b[i]);
}结果是:
--- byte[0]=78
--- byte[1]=da
--- byte[2]=f3诸若此类。
我只想了解哪些位是deflate规范中描述的3位块头。第一位指定块final/BFINAL。接下来的两位指定BTYPE。
基于此结果,0x78 -前3位是000,这意味着BFINAL=0,BTYPE=00/无压缩。但在我看来这是不对的。BTYPE应指定01或10。
我是不是漏掉了什么?有人能帮帮忙吗?
发布于 2020-10-30 21:51:36
您正在生成zlib流,而不是原始的deflate流。因此,78 da是zlib头文件,而不是压缩数据。通货紧缩数据以f3开头。其中最低的三位是011。低1是BFINAL (这是最后一个块),01是BTYPE (固定霍夫曼代码)。
https://stackoverflow.com/questions/64606396
复制相似问题