微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从压缩压缩输出结果中解码压缩块头

如何解决如何从压缩压缩输出结果中解码压缩块头

我正在尝试根据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。

在这里错过了什么吗?有人可以帮忙吗?

参考: deflate specification

解决方法

您正在制作zlib流,而不是原始的deflate流。因此78 da是zlib标头,而不是压缩压缩数据。放气数据以f3开头。其低三位是011。低1是BFINAL(这是最后一个块),而01是BTYPE(固定的霍夫曼代码)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。