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; i<10000; i++){
char ch=(char)(97+rand()&);
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
