资源简介

基于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 < _CODE_NUM; ++i) _codes[i].oldCode = 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 < _CODE_NUM; ++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


评论

共有 条评论