免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2631 | 回复: 7
打印 上一主题 下一主题

[算法] 最近在研究zlib解压,为什么解压时取编码最长那么多个比特作为树的下标?帮帮谢谢了! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-27 09:18 |只看该作者 |倒序浏览
本帖最后由 tiwowo 于 2010-05-27 17:11 编辑

while (state->have < state->nlen + state->ndist) {
                for (; {
                    this = state->lencode[BITS(state->lenbits)];
                    if ((unsigned)(this.bits) <= bits) break;
                    PULLBYTE();
                }

这里的 state->lenbits 代表的是编码最长的比特占多少位;
BITS (n)取的是低n比特;

我看压缩数据发送的时候是连续发送的啊? 没有注明码长啊;
有哪位大侠帮忙解答下啊?
附件 附带源码;

zlib-1.2.3.tar.gz

484.96 KB, 下载次数: 20

zlib压缩源码

论坛徽章:
0
2 [报告]
发表于 2010-05-27 11:50 |只看该作者
哈夫曼?

论坛徽章:
0
3 [报告]
发表于 2010-05-27 11:53 |只看该作者
对就是霍夫曼

论坛徽章:
0
4 [报告]
发表于 2010-05-27 17:12 |只看该作者
有人帮忙没? 我天天等

论坛徽章:
0
5 [报告]
发表于 2010-05-28 11:39 |只看该作者
帮帮忙我等了2天了

论坛徽章:
0
6 [报告]
发表于 2010-05-28 13:41 |只看该作者
本帖最后由 没本 于 2010-05-28 13:43 编辑

没人回帖我胡说两句抛砖引玉吧。二十年前读中学的时候接触过霍夫曼编码,以ZIP的为例。编码树是随字典条目的增加而增长的,而解压过程又是编码树的生成过程的重复,因此字典是在解压过程中自生成的。压缩软件只是对最大编码长度做了限制,以免字典超过内存限制。
对楼主的问题,简单回答就是霍夫曼编码不是定长编码,字典中不同条目对应的霍夫曼编码树的码值都不一样,选最长的能保证覆盖字典中所有词条。

论坛徽章:
0
7 [报告]
发表于 2010-05-28 15:22 |只看该作者
只是曾经调用过压缩与解压缩的函数,没有深研究过

论坛徽章:
0
8 [报告]
发表于 2010-05-28 17:08 |只看该作者
但是他的那个取值得到的this 存储的就是实际编码了; 那如果两个编码 连在一起如 101 和 01 2个编码 满足前缀码不重复; 连在一起 每次取3比特;取出来的值不就是错误的了吗? 我就是这里没想明白;  压缩时是对编码进行了处理 限制了码长最长是15;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP