网站大量收购独家精品文档,联系QQ:2885784924

Huffman压缩与解压.doc

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Huffman压缩和解压 一、?需求分析 1. 本演示程序中,模拟的是小写26个英文字母的Huffman压缩,字母小随机函数随机产生,后统计字母个数建立Huffman树,用建立Huffman树将字母转为二进制流,再将二进制流每次分8个转为一个Unsigned Char写入物理内存! 2. 解压时建立同样的Huffman树或读取已保存的Huffman树,通过将读取的Unsigned Char转为比特流,再由比特流得到原被压缩的字母 3. 程序执行的命令有:随机文件的产生,文件统计,Huffman树的建立,压缩,解压,程序的运行过程和其它信息的文件存储! 4. 程序测试:运行程序,产生随机文件input.txt,压缩时得到的比特流bytes.txt,压缩文件compress.txt,解压时到得的比特流uncompress.txt,解压后文件output.txt和程序的运行过程文件Run.txt,其中红色文件为可无文件 二、?概要设计 1. 为达到压缩效果,采用Huffman树来进行编码压缩 2. Huffman编码后若直接保存比特流至txt将达不到压缩的效果,因此建议将比特流转为Unsigned char 来间接存储以达到明显的压缩效果 3. 解压时因用到之前的Huffman树,因此在压缩时有必要保存树的状态 4. Huffman树在压缩时直接使用对应编码即可,在解压时通过遍历树来得到被编码的字母 三、?详细设计 1. 树结构体的定义和全局变量的定义: typedef struct HTNode{/*Huffman Tree 的结构定义*/ ??? unsigned int weight; ??? unsigned int parent, lchild, rchild; }HTNode,* HuffmanTree; typedef char** HuffmanCode;/*指向字符指针的指针的数据的定义*/ int stat[27];/*存储总数,存储26个字母出现的次数*/ HuffmanTree HT; ??????? HuffmanCode HC; 2. 随机文件的产生函数: void CreatFile(){/*自动产生文件*/ ??? FILE *Fopen,*Fout; ??? int i; ??? srand( (unsigned)time(NULL)); ??? Fout=fopen(./Run.txt,w); ??? fprintf(Fout,NO.1: Creating a file by rand()n); ??? Fopen = fopen(./input.txt, w); ??? for(i=0; i10000; i++){ ??????? char ch=(char)(97+rand()%26); ??????? fputc(ch, Fopen); ?????? } ??? fclose(Fopen); ??? fclose(Fout); } 3. 字母个数的统计: void ReadStat(char *Filename){/*每个字符出现的次数统计*/ ??? int c; ??? FILE *Fopen=fopen(Filename, r); ??? while((c=fgetc(Fopen))!=EOF){ ??????? stat[c%96]++; ??????? stat[0]++; ??? } } 4. 选择HT[1…i-1]中Parent为0且Weight最小的一个点的函数: void Select(HuffmanTree HT, int d, int *s){ ??? int temp=0,i; ??? for(i=1; i=d; i++){ ?????????? if(HT[i].parent!=0) ????????????????? continue; ?????????? if(temp==0) ????????????????? temp=i; ?????????? else if(HT[temp].weightHT[i].weight) ????????????????? temp=i; ??? } ??? *s=temp; } 5. Huffman树的建立函数: void HuffmanCoding(int* w, int n){ ??? int m= 2*n-1; ??? int i, s1, s2, start; ??? unsigned int c, f; ??? char *cd; ??? if(n=1) ?????????? return; ??? HT=(HTNode*)malloc((m+1)*sizeof(HTNode));/*0号单元未用*/ ???

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档