huffmancodec.h

来自「这是本人编写的一个Huffman压缩算法,压缩效率最好能达到%20左右,已将所有」· C头文件 代码 · 共 110 行

H
110
字号
#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 + =
减小字号Ctrl + -
显示快捷键?