資源簡介
基于Huffman編碼樹原理實現的壓縮和解壓縮小程序,編碼單位為一字節。

代碼片段和文件信息
#include?“HuffmanEncoderCompress.h“
#include?
#include?
#include?
using?namespace?std;
HuffmanEncoderCompress::HuffmanEncoderCompress(const?string&?inputFileName?bool?isCompress):
_isCompress(isCompress)
_inputFileName(inputFileName)?_outputFileName(inputFileName+“.zLzip“)?
_inputFileSize(0)?_outputFileSize(0)?_huffmanTreeRoot(nullptr)
{
for?(int?i?=?0;?i?}
//?釋放節點及其子樹?
HuffmanEncoderCompress::freeNode(HuffmanTreeNode*?np)?{
if?(np)?{
freeNode(np->left);
freeNode(np->right);
delete?np;?
}
}?
//?析構?
HuffmanEncoderCompress::~HuffmanEncoderCompress()?{
freeNode(_huffmanTreeRoot);?
}
//?運行?
void?HuffmanEncoderCompress::run()?{
FILE?*inputFp?=?NULL;
if?((inputFp?=?fopen(_inputFileName.c_str()?“rb“))?==?NULL)?{
printf(“open?file?%s?failed!\n“?_inputFileName.c_str());
exit(-1);
}
char?zipName[_ZIP_NAME_LEN];
fread(zipName?_ZIP_NAME_LEN?1?inputFp);
if?(_isCompress?||?strcmp(zipName?_ZIP_NAME))?{ //?無識別符,非壓縮文件?
fclose(inputFp);?
printf(“開始壓縮文件%s......\n“?_inputFileName.c_str());?
printf(“正在統計頻率......\n“);
statisticalFrequency(); //?統計頻率?
printf(“正在構建哈夫曼樹......\n“);
_huffmanTreeRoot?=?buildHuffmanTree(); //??構建哈夫曼樹?
printf(“正在產生新編碼......\n“);
getNewCodes(_huffmanTreeRoot?0?string()?0); //?獲得新編碼?
// printHuffmanEncodeInfo();
printf(“正在壓縮......\n“);
compress(); //?壓縮?
printInfo(“壓縮“);?
printf(“壓縮成功\n“);
}?else?{ //?有識別符,是壓縮文件?
printf(“開始解壓縮文件%s......\n“?_inputFileName.c_str());
printf(“讀取原始文件信息......\n“);?
char?outputFileName[_FILE_NAME_LEN];
fread(outputFileName?_FILE_NAME_LEN?1?inputFp); //?讀入原文件名?
printf(“原始文件名為%s\n“?outputFileName);?
_outputFileName?=?string(outputFileName);?
fread(&_outputFileSize?_FILE_NAME_LEN?1?inputFp);? //?讀入原文件大小
for?(int?i?=?0;?i? fread(&_codes[i].frequency?_CODE_FREQUENCY_LEN?1?inputFp);
fclose(inputFp);
printf(“正在構建哈夫曼樹......\n“);
_huffmanTreeRoot?=?buildHuffmanTree(); //??構建哈夫曼樹?
printf(“正在產生新編碼......\n“);
getNewCodes(_huffmanTreeRoot?0?string()?0); //?獲得新編碼
// printHuffmanEncodeInfo();
printf(“正在解壓縮......\n“);
uncompress(); //?解壓縮?
printInfo(“解壓縮“);
printf(“解壓成功\n“);
}?
}
//?統計頻率?
void?HuffmanEncoderCompress::statisticalFrequency()?{
//?打開文件?
FILE?*inputFp?=?NULL;
if?((inputFp?=?fopen(_inputFileName.c_str()?“rb“))?==?NULL)?{
printf(“open?file?%s?failed!\n“?_inputFileName.c_str());
exit(-1);
}
//?統計頻率?
while?(!feof(inputFp))?{
unsigned?char?inputByte;
fread(&inputByte?1?1?inputFp);
if?(feof(inputFp))?break;
++_codes[inputByte].frequency;
++_inputFileSize;
}
fclose(inputFp);
}
//?構建?Huffman?樹?
HuffmanTreeNode*?HuffmanEncoderCompress::buildHuffmanTree()?{
//?使用優先隊列,自定義比較器?
priority_queue?C
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????3490??2019-04-18?08:33??HuffmanEncoder\bak.txt
?????文件???????1186??2019-04-18?17:46??HuffmanEncoder\HuffmanEncoder.dev
?????文件????1860325??2019-04-20?09:08??HuffmanEncoder\HuffmanEncoder.exe
?????文件????????224??2019-04-18?18:00??HuffmanEncoder\HuffmanEncoder.layout
?????文件?????281615??2019-04-18?08:54??HuffmanEncoder\HuffmanEncoder.o
?????文件???????4639??2019-04-19?21:44??HuffmanEncoder\HuffmanEncoder.rar
?????文件??????11386??2019-04-20?09:08??HuffmanEncoder\HuffmanEncoderCompress.cpp
?????文件???????3084??2019-04-20?09:08??HuffmanEncoder\HuffmanEncoderCompress.h
?????文件?????315671??2019-04-20?09:08??HuffmanEncoder\HuffmanEncoderCompress.o
?????文件????????833??2019-04-20?09:08??HuffmanEncoder\main.cpp
?????文件??????90381??2019-04-20?09:08??HuffmanEncoder\main.o
?????文件???????1423??2019-04-20?09:08??HuffmanEncoder\Makefile.win
?????文件?????????12??2019-04-18?20:28??HuffmanEncoder\out.txt
?????文件????2248393??2019-04-19?20:26??HuffmanEncoder\test\input.exe
?????文件????1251824??2019-04-19?08:19??HuffmanEncoder\test\pdfzhuanhuan2.exe
?????文件????4204022??2019-04-19?21:49??HuffmanEncoder\test\pic.png
?????文件????2248950??2019-04-19?20:27??HuffmanEncoder\test\zLzip壓縮.exe
?????目錄??????????0??2019-04-20?09:23??HuffmanEncoder\test
?????目錄??????????0??2019-04-20?09:08??HuffmanEncoder
-----------?---------??----------?-----??----
?????????????12527458????????????????????19
評論
共有 條評論