⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffmancodec.h

📁 这是本人编写的一个Huffman压缩算法,压缩效率最好能达到%20左右,已将所有的编码串转换成为二进制码
💻 H
字号:
#ifndef _HUFFMANCODEC_H
#define _HUFFMANCODEC_H
//
//
// Huffman编解码器 
//
//
#include <iostream.h>

typedef struct _HuffmanCodecPar  //赫夫曼编码器参数
{
	unsigned char	cNum;       //待编码字符
	unsigned int	nWeight;    //待编码字符权值
//	unsigned int    nCode;      //待编码字符的16位编码串
//	unsigned char   nCodeLen;   //字符编码长度
}HUFFMANCODECPAR , *PHUFFMANCODECPAR;

typedef struct _HuffmanTreeNode  //赫夫曼编码树结点
{
	unsigned char	cNum;		//代编码字符
	unsigned int	weight;		//权值
    unsigned int    nCode;      //待编码字符的16位编码串
	unsigned char   nCodeLen;   //字符编码长度

	unsigned int parent;	//双亲节点的序号,下标
	unsigned int lchild;	//左孩子的下标
	unsigned int rchild;	//右孩子的下标
}HTNODE, *PHUFFMANTREE;

typedef unsigned char * *HuffmanCode;

class   CHuffmanCodec
{
private:


	PHUFFMANTREE HT;
	PHUFFMANCODECPAR      pCodecPar;	//待编码字符串数据区指针
	unsigned int          nCodecParLen; //待编码数据区长度

	unsigned int	      m_nMin1 , m_nMin2; //保存最小的两个节点的序号
	unsigned int	      nNodeNum;


protected:
	void CountDataFrequence(unsigned char     * pData,       //原始数据区 
						    long              nLen);         //原始数据区长度
	//赫夫曼编码算法
	void HuffmanCoding();
	//赫夫曼解码算法
	void HuffmanDeding();
	void SelectTwoMin(unsigned int nNum);



	//得到接点的左孩子节点位置
	unsigned int GetLeftChild(PHUFFMANTREE TreeNode);
	//得到节点的右孩子节点位置
	unsigned int GetRightChild(PHUFFMANTREE TreeNode);


	//编码程序
	//         将赫夫曼字符串编码变成二进制码
	//
	void EncodeHuffmanStr(unsigned char *str , unsigned int &nCode , unsigned char & nCodeLen);
	//解码程序
	//         将二进制码还原成原始编码
	//
    void DecodeHuffmanCode(unsigned char     * pCompressData,	//压缩数据区
						   long              nCompressLen,       //压缩数据区长度
						   unsigned char     * pData,           //原始数据区
					       long              & nLen               //原始数据区长度
						   );

    
public:
	CHuffmanCodec();
	~CHuffmanCodec();
	//
	//赫夫曼编码器
	//
	void HuffmanEncode(unsigned char     * pData,		    //原始数据区 
					   long              nLen,		        //原始数据区长度
					   unsigned char     * pCompressData,   //压缩数据区
					   long              & nCompressLen,    //压缩数据区长度
					   unsigned char     & nBitLen          //压缩数据余位数
					   );     

	//赫夫曼解码器
	bool HuffmanDecode(unsigned char     * pCompressData,	//压缩数据区
					   long              nCompressLen,      //压缩数据区长度
                       unsigned char     nBitLen,           //压缩数据余位数
					   unsigned char     * pData,           //原始数据区
					   long              & nLen             //原始数据区长度 
					   );

	unsigned int GetHuffmanTreeNodeNum()
	{
		return nNodeNum;
	}
	//得到赫夫曼编码树
	void GetHuffmanTree(PHUFFMANTREE pTreePtr);
	//设置赫夫曼编码树
	void SetHuffmanTree(PHUFFMANTREE pTreePtr , unsigned int nTreeNodeNum);
};



#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -