首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从deflate压缩输出结果中解码deflate块头

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

Stack Overflow用户
提问于 2020-10-30 18:13:33
回答 1查看 78关注 0票数 1

我正在尝试根据deflate压缩输出的输出字节来解码标题位。

代码语言:javascript
复制
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]);
}

结果是:

代码语言:javascript
复制
--- 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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-30 21:51:36

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64606396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档