资源简介
基于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
相关资源
- de2开发板上的万年历
- 纹理合成的图像修复程序
- jsoncpp-src-0.6.0-rc2
- 2/3FEC编码
- 基于自适应窗口的立体匹配
- 随机生成大素数
- Qt 雷达图 卫星图
- CTK编译库文件
- 超级玛丽源代码资源包
- cc攻击源码
- 基于QT的象棋游戏
- 串口调试助手十六进制数据转成十进
- Spring MVC4 中文高清 PDF (压缩包)
- VC上用的曲线控件多个
- 满足三角不等式的TSP问题的近似算法
- opengl简单地形绘制
- 试卷生成系统
- eigen库.zip
- GenP_2.6压缩包
- 精简版黑白棋demo-Qt
- 文本文件字符串的检索和计数KMP算法
- Visual Studio中使用开源二维码QR库libq
- Spark中的压缩编解码的最佳实践
- VC++开发的仓库管理系统设计文档和
- PPT、Word、Excel等压缩工具
- dianyajiance.rar
- 华为边缘计算核心板开发帮助手册
- 数据压缩-吴乐南带书签
- tsmc18rf_pdk_v13 压缩包3
- 基于QT的网络视频直播软件
评论
共有 条评论