Huffman压缩和解压

it2022-05-09  31

 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

转载请注明原文地址: https://win8.8miu.com/read-1484661.html

最新回复(0)