资源简介
基于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
相关资源
- VisualStudioUninstaller vs卸载工具
- 组态王驱动开发包3.0.0.7(中文)
- 多窗口后台鼠标连点器
- 使用选择性重传协议实现UDP可靠通信
- 介绍几种压缩算法及《笨笨数据压缩
- VC 获得文件属性 获取文件的创建时
- 读者写者问题(读者优先,写者优先
- 用VC 编写的仿QQ聊天室程序源代码
- 外点法程序
- 外罚函数程序
- qt-电子点菜系统
- 推箱子及人工智能寻路C 源代码
- 自己写的航空订票系统c 版--数据结构
- 数据结构实验魔王语言
- MUSIC算法c 实现
- C 餐厅叫号系统(QT平)
- 国际象棋c 完整版
-
ob
jectARX给Auto CAD加工具条 - 画图程序MFC/VC/VC CRectTracker 串行化
- MFC网络编程实例
- c 课程设计 职工信息管理系统
- VC 游戏编程—附源代码
- IpHlpApi.h&IpHlpApi.lib
- 清华大学 c 郑莉 ppt课件
- c 程序判断离散数学中命题公式
- 多项式求和(数据结构C 版)
- vc 6.0开发的流程图编辑器
- VC 天空盒(skyBox)实现(附源代码)
- c MFC 画多边形
- 用C 实现的对网络上的ARP数据包进行
评论
共有 条评论