Compress.h
#ifndef COMPRESS_H
#define COMPRESS_H
int Compress(const char* pFilename);
char Str2byte(const char* pBinStr);
int Encode(const char* pFilename, const HuffmanCode pHC, char* pBuffer, const int nSize);
struct HEAD
{
char type[4];//文件类型
int length;//原文件长度
int weight[256];//权值数值
};
int WriteFile(const char* pFilename, const HEAD sHead, const char* pBuffer, const int nSize);
int InitHead(const char* pFilename, HEAD& sHead);
#endif
Huffman.h
#ifndef HUFFMAN_H
#define HUFFMAN_H
#define OK 1
#define SIZE 256
struct HTNode {
int weight;//权值
int parent;//父节点
int lchild;//左孩子
int rchild;//右孩子
};
typedef HTNode* HuffmanTree;//动态分配数组存储Huffman树
typedef char** HuffmanCode;//动态分配哈夫曼编码表
//void PreorderTraverse(int root, HuffmanTree pHT);
int HuffmanCoding(HuffmanCode& pHC, HuffmanTree& pHT);
int Select(HuffmanTree pHT, int nSize);
void TestHufTree(HuffmanTree pHT);
void TestHufCode(int root, HuffmanTree pHT, HuffmanCode pHC);
void TestHufTreeN(int root, HuffmanTree pHT);
int HfmTree(HuffmanTree& pHT, int* w, int n);
#endif
Compress.cpp
#include"huffman.h"
#include"Compress.h"
#include<iostream>
#pragma warning( disable : 4996)
using namespace std;
//Compress
//InitHead
//Encode
//Str2byte
//WriteFile
char Str2byte(const char* pBinStr)
{
char b = 0x00;
for (int i = 0; i < 8; i++)
{
b = b << 1;
if (pBinStr[i] == '1')
{
b = b | 0x01;
}
}
return b;
}
int Compress(const char* pFilename)
{
int weight[256] = {
0 };
//以二进制打开文件
FILE* in = fopen(pFilename, "rb");
if (in == NULL)
{
cout << "Failed to open the file!" << endl;
exit(0);
}
cout << "成功打开文件 " << pFilename << endl;
int ch;
while ((ch = getc(in)) != EOF)
{
weight[ch]++;
}
fclose(in);
//cout << "Byte Weight" << endl;
//for (int i = 0; i < SIZE; i++)
//{
// printf("0x%02X %d\n", i, weight[i]);
//}
HuffmanTree hfmt;
HfmTree(hfmt, weight, SIZE);
cout <<

本文介绍了一种基于霍夫曼编码的文件压缩算法实现,包括霍夫曼树的构建、编码过程、文件读写及压缩率计算。通过具体代码示例展示了如何对文件进行高效压缩。
最低0.47元/天 解锁文章
4023





