1 / 12
文档名称:

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

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

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

分享

预览

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

上传人:cdsqbyl 2015/8/29 文件大小:0 KB

下载得到文件列表

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

相关文档

文档介绍

文档介绍:本程序是本人学****数据结构时自己写的,可以压缩、解压缩任意格式文件。由于本人水平有限,里面会有缺陷,若有兴趣,可以多多指正!!! Email:e9999e@
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////[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>
using namespace std;
/////////////////////////////////////////////////////////////////////////////////////////
//HuffmanNode 节点定义
struct Hu