内容发布更新时间 : 2024/12/26 22:24:09星期一 下面是文章的全部内容请认真阅读。
Huffman编码与解码实现文件压缩与解压
outByte='\\0'; for(i=0;i<(int)waiting.length ();i++) { } outByte=outByte<<1; if(waiting[i]=='1') outByte|=1;
outByte=outByte<<(8-waiting.length ());//将编码字段从尾部移到字节的高位 outfile.write((char *)&outByte,sizeof(unsigned char));//存入最后一个字节 } outfile.write((char *)&outByte,sizeof(unsigned char));//存
outByte=static_cast
解压缩函数:
void HuffmanTree::Decompress(const char *fn1,const char *fn2) { ifstream ifile(fn1,ios::binary ); ofstream ofile(fn2,ios::binary );
8 } } infile.setf (ios::skipws ); infile.close ();//关闭文件 outfile.close (); Huffman编码与解码实现文件压缩与解压
ifile.unsetf (ios::skipws ); ifile.seekg (0,ios::beg);//将文件指针置于文件开始 int i; //for(i=0;i<256;i++) // ifile.read ((char *)&(tree[i].weight),sizeof(long)); //this->BuildTree (); unsigned char inbyte1=0,inbyte2=0,inbyte3=0; int p=510,len=8; ifile.read ((char *)&inbyte1,sizeof(inbyte1));//读取第一个字节 ifile.read ((char *)&inbyte2,sizeof(inbyte2));//读取第二个字节 if(ifile.eof())//考虑只有两个字节 { len=static_cast
} } while(!ifile.eof())//没到文件结尾 { ifile.read ((char *)&inbyte3,sizeof(inbyte3));//读取下个字节
if(!ifile.good())//考虑最后一个字节的情况,计算其对应的编码的长 度
len=static_cast
Huffman编码与解码实现文件压缩与解压
} } inbyte2=inbyte3; ifile.setf(ios::skipws);//文件流复位 ifile.close (); ofile.close(); 3.2 执行效果
运行改程序弹出菜单,供用户选择,其效果如下:
选择菜单1提示用户输入被压缩文件名和压缩后的文件名运行结果如下:
选择菜单2 进行解压操作得到的界面如下: Huffman编码与解码实现文件压缩与解压
需要退出操作,用户可以选择菜单0 四、测试结果
此压缩软件起到了良好的压缩效果,部分测试数据的结果如下表:表 《一》 表 《一》
从以上结果可以看出此软件对较大的文件效果跟明显,这是与事实相符的,因为文件越大,字符的重复率越高,根据此软件实现算法,频率越高的字符其编码反而短,效果自然更明显。 五、收获与体会
(1) 哈夫曼编码有一些缺点:对于短的文件进行编码意义不大,因为较短的文件字节的重复率不是很高。
(2)哈夫曼进行解压缩软件设计时候,其核心是哈夫曼树,它编码和译码的纽带。该压缩软件采用的正是哈夫曼算法,建立哈夫曼树,对原文件进行哈夫曼编码,通过将哈夫曼算法应用于压缩软件,更进一步理解哈夫曼树的建立和对各个叶子节点的编码。哈夫曼技术对多种文件压缩率很高,对于二进制这种法也很成功。
(3)该程序中因为涉及文件操作,多次读写文件,为了保证操作后的文件与原文件的一致性,在打开或者建立新文件时都是以二进制进行操作,着不仅加深了我们对文件操作的理解,也在程序中体现了完整性,并且将解压后的文件和原文件相比较具有一致性,体现的程序的健壮性 Huffman编码与解码实现文件压缩与解压
(4)通过这次课程设计,强化了我结构化编程的思想,对复杂问题的数据结构化有了更深刻的了解,对数据结构有了更深的理解,提高了我对算法的设计层次。 六、参考文献
(1) 数据结构教程(C++版)/吉根林,陈波主编,—北京:电子工业出版社,2009.2
(2) 现代计算机2008年下半月11期