1 / 12
文档名称:

哈弗曼编码 压缩任意格式文件.doc

格式:doc   大小:43KB   页数:12页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

哈弗曼编码 压缩任意格式文件.doc

上传人:坐水行舟 2019/5/3 文件大小:43 KB

下载得到文件列表

哈弗曼编码 压缩任意格式文件.doc

文档介绍

文档介绍:本程序是本人学****数据结构时自己写的,可以压缩、解压缩任意格式文件。由于本人水平有限,里面会有缺陷,若有兴趣,可以多多指正!!! Email://////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[BEGIN]////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////时间:2012年5月9日10:24:19//编译器:VC++//数据组织:参见程序的详细说明//功能:哈弗曼压缩文件(可以压缩并解压任何格式文件),参见程序的详细说明//历时:2天/* *************************************************************************** Bug修复 *************************************************************************** 【18:13:00修复了:文件中只有一种英文字符无法压缩和解压缩的Bug。解决办法参见本文件中哈夫曼树的创建函数】 【20:49:00修复了:不能准确还原文件的Bug,是解压文件与原文件大小等完全相同,另外还可以压缩、解压其他任何类型文件(doc、jpg等)。具体修复办法参见压缩、解压缩】*//* *************************************************************************** 程序的详细说明 *************************************************************************** 本程序是适用于所有格式文件。。。。//-----------------【注意,以下是对于文本文件的思考。因为是二进制操作文件,故适用于所有格式文件】 如何实现压缩文件呢,首先考虑到字符存储问题,英文是一个字节存储的,汉子是两个字节存储的。 都属于定长存储(定长编码),可以利用哈夫曼树对其进行编码,使其转换为变长的前缀编码。 那么,如何实现编码的转换呢?考虑到汉子也可以将其两个字节分别处理,故这里采用单个字节处理的办法, 将每个字节进行编码。 首先读取文件,计算出每个字节出现的次数。次数即权值,对其进行构造哈夫曼树,然后求出编码,将编码存储在一个 二维数组中。再次打开想要压缩的文件,每读入一个字节,就对其进行编码,并写入压缩文件。 由于将编码后的数据写入压缩文件时,需整个字节操作,即编码数据刚好整个字节时(可以是多个字节)写入压缩文件, 故此处利用一个整形变量作为缓冲。 解压缩时,需再次将与压缩时相同的哈夫曼树构造出来,以便进行译码。因此压缩时存储了,原文件中各个字节出现的 次数(也就是权值),这样就能再次构造出哈夫曼树。【注意】这里当然也可以将哈夫曼树存储下来,解压时再次重构。 解压时,读取字符出现的次数,重构出哈夫曼树,进行译码。这里也是读取整个字节(可以是多个),按位进行译码。*//////////////////////////////////////////////////////////////////////////////////////////#include<iostream>#include<string>#include<fstream>usingnamespacestd;///////////////////////////////////////////////////////////////////////////////////////////HuffmanNode节点定义structHuffmanNode{ unsignedcharvalue; //字符内容 doublecost; //权值 HuffmanNode*leftChild,*rightChild,*parent; HuffmanNode(intweight=0)