huffman基于静态哈夫曼编码文件压缩.pdfVIP

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于静态哈夫曼编码的文件压缩 指导老师:石慧 作者:韦邦灯 E-Mail :syshunter@ 班级:07 计升 2 班 学号:078123030201 数据结构课程设计 一、问题描述 本次所选为课题 8:采用哈夫曼编码思想实现文件的压缩和恢复功能。并提供压缩前后 的占用空间之比。要求:描述压缩基本符号的选择方法;运行时的压缩原文件的规模应不小 于 5k;提供恢复文件与原文件的相同性对比功能。 二、模型描述 由于题目已经明确给出采用哈夫曼树模型,故我们只需考虑相关的存储结构与文件操作 等。 三、算法设计 本次课程设计所采用的开发平台是 winxp+vc60+msdn60,为方便将设计重点放在算法核 心上,GUI采用MFC库,方便开发.为了能达到对任意文件进行压缩解压缩的目的,文 件读写采用二进制形式。由于该课题涉及到压缩与解压缩两部分,下面分别讨论。 压缩部分: 为了能将指定文件通过哈夫曼编码形式压缩。首先必须构造哈夫曼树。为确定文件中字 符的权值,我采用的方法是使用该字符出现的次数作为权值。因为每个字符占 8 位,故最大 可表示范围为 0xff 。生成的哈夫曼树最大长度为 256*2-1 ;在构建好哈夫曼树后,生成字符 与哈夫曼编码的对照链表(Clist )。接下来需要再次读取文件,每次读 8bit (一个字节)。通 过查询前面创建的 Clist,将该编码写入新的文件(即压缩文件)。下面讨论每步的实现; 1:扫描文件统计字符出现次数,存入Clist 链表 typedef struct node { unsigned char ch; //字符 WEIGHT_TYPE weight; //权值(用出现次数表示) char *code; //对应的HUFFMAN编码 struct node *next; } CNode,*Clist; 2 :将Clist 链表中的 weight 依次赋予权值数组 w[] 。然后创建对应的哈夫曼树。哈夫曼树节 点定义如下: typedef struct huff { union { //利用union节省树长度个字节 unsigned char ch; unsigned int lchild; }; WEIGHT_TYPE weight; unsigned int parent,rchild; }HTNode,*HuffmanTree; 3 :首先将生成哈夫曼树的长度写入文件,再将生成的哈夫曼树写入压缩文件。因为我采用 的是每 8bit 一编码,所以该哈夫曼树的长度最大是 256*2-1 。我写入的是一个4 字节整型 4 :再次读取文件,每次读取 4096 字节存入缓冲,通过 Clist 得到缓冲中每个字符对应的哈 夫曼编码,写入压缩文件。这里的问题是,由于编码是变长的,且文件操作最小单位是 8bit。 所以必须将不足 8bit 的编码补后面的字符编码,超过 8bit 的必须截断为 8bit,剩余bit 与后 面的编码合并。我采用的方法是: (1)设置缓冲字符cache,初始=0 ;移位计数变量bi=1 (2 )从读缓冲取一个字符查表得到哈夫曼编码存入code,计算该 code 长度作为循环条件 (3 )从code 高位取一位编码 存入临时 c ; (4 )cache=cache*2 ; (5 )cache=cache+c; (6 )如果bi==8 ,则将 cache 写入压缩文件,重设 cache=0,bi=1 ;否则bi++ ; (7 )转去(3 ),直到code 的所有位均已取完。 (8 )转去(1),直到缓冲中所有字符已经取完。 5 :关于文件尾部未对准字节的处理。在步骤 4 将编码写入压缩文件时,当遇到一个字节的 编码不足 8bit 时。为了能在解

文档评论(0)

xiaofei2001129 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档