《霍夫曼编码对英文文本的压缩和解压缩》由会员分享,可在线阅读,更多相关《霍夫曼编码对英文文本的压缩和解压缩(12页珍藏版)》请在金锄头文库上搜索。
1、ffman编码对英文文本的压缩和解压缩中国地质大学计算机学院信息安全专业信息论实验报告#inlude #include #nudeconihstucth usne char ;/记录字符在数组中的位置log count;/字符浮现频率(权值)on ae,l,rch;/定义哈夫曼树指针变量cr bits256;/定义存储哈夫曼编码的数组 heade12,mp;vodcompss() fileame255,outputfile5,b12; unsicr ; long n,m,i,j,f; /作计数或临时存储数据用ong in1,pt1,flength=0,engt1,legth2;/记录最小结点、
2、文献长度double div;/计算压缩比用FILE *ifp,*fp; /分别为输入、输出文献指针pitf(请您输入需要压缩的文献(需要途径):); gts(filnme); i=fopn(ila,rb); if(ifp=NU)prit(t文献打开失败!n ); sytem(use); return;prif(t请您输入压缩后的文献名(如无途径则默觉得桌面文献):); get(outpul); ofpfpn(outptfil,wb);if(op=NUL)printf(nt压缩文献失败!n ); system(ue); rtrn; ngth0; wi(!fe(ifp)frea(&c,1,ifp
3、);headrc.cout+;/字符反复浮现频率+1flenth+;/字符浮现原文献长度+flength-; legth1=length;/原文献长度用作求压缩率的分母heaerc.nt-; fr(0;51;i+)if(headei.out!=) hdei.b=(unignedchar); 将每个哈夫曼码值及其相应的A码寄存在一维数组heaeri中,且编码表中的下标和CI码满足顺序寄存关系*/ese headeri.b; haderi.paren=-1;heaeri.hhedrrch=-1;/对结点进行初始化 for(i0;i6;i+)/按浮现权值从大到小排序for(=+1;j256;j+)i
4、f(headricouthadej.cu)tmphead;haderi=heerj; hederj=t; for(=;i256;+)/找到第一种空的had结点if(headeri.cou=0) beak; n=i; m2*n1;for(=n;m;i+)min=;/预设的最大权值,即结点浮现的最大次数for(j=;ji;)if(header.parent!=-1) contiue;*paren!=-阐明该结点已存在哈夫曼树中,跳出循环重新选择新结点i(min1headrj.cut)pt1=j; min=eaderj.coun; contnue;headercount=edert1.coun; h
5、eaderpt.paren=i; headeri.lcht1; min1=;fr(j=;jeaderj.cut)t; 1=eadecont; cotinu;headeri.counteaerpt1count;headeihp1; hedept.aret=i;/哈夫曼无反复前缀编码fo(0;i=8)for(i=0;8;+)if(bui=)c=(c1);/添加最后一位为1elsec=c0)/最后不满八位的buf解决trca(uf,00000000);/uf后加八位0fo(i=;i8;+)/逐位输入八位前的二进制符f(uf=1) c=(c1)|1; ls =c; fite(&c,1,,f); pt1
6、+; fsek(fp,SEEK_S);/指针回到输出文献头部背面四位fwrite(&pt1,eof(ln),,of);/p1记录了输出文献中的字符个数,涉及了最后的/0se(of,pt1,EEST); fwrite(&n,zof(long),1,ofp);/记录了权值不为0的heade数量o(i0;in;i+)fwite(&(aderi.b),,1,ofp);/依次写入每个叶子结点的b、长度和内容cstrle(eeri.bis);fwrite(&,1,1,fp); jslen(hdei.it); if(j%8!0)若存储的位数不是8的倍数,则补0for(f=%8;f8;f+) srt(head
7、eri.is,0);while(headerbs0!=0)*字符的有效存储不超过8位,则对有效位数左移实现两字符编码的连接,可理解为前缀编码也被压缩过/c=0;for(j=0;j8;j+)if(headei.it=1)=(c1)|; lse c=1;strcpy(eeiit,heaei.its+); wri(&c,1,1,fp);/以上与上面连接字符一段可相似理解 lengh2=t1-;dv(dubl)lng1-(double)lnth)/(dou)leng1;/计算文献的压缩率cose(ifp); fclos(ofp);rt(nt压缩文献成功!n);int(t压缩率为 %f%nn,div*100);