资源简介
网上很多哈夫曼源代码要不是复制,要不是对文件操作,无法对内存缓冲区使用。自己写了一个c++类封装的,接口简洁,方便使用,提供对缓冲区内存的编码和解码,测试可行。但编码和解码时间较长,以后改进。

代码片段和文件信息
#include “HuffMan.h“
string CHufffMan::HuffDeCode(const char *bufferunsigned int ilenint ipos)
{
memcpy(m_cFreqbufferCHAR_NUM*sizeof(unsigned int));
CreateQueue();
CreateHuffManTree();
return DeCode(buffer+=CHAR_NUM*sizeof(unsigned int)ilen-CHAR_NUM*sizeof(unsigned int)ipos);
}
void CHufffMan::StatisCharFreq(const char *bufferunsigned int ilen)
{
memset(m_cFreq0CHAR_NUM*sizeof(unsigned int));
for (unsigned int i=0;i {
m_cFreq[(unsigned char)buffer[i]]++;
}
}
void CHufffMan::CreateQueue()
{
m_FreqQue.clear();
for (int i=0;i {
if (m_cFreq[i])
{
m_FreqQue.insert(make_pair(im_cFreq[i]));
}
}
}
void CHufffMan::CreateHuffManTree()
{
int iNode=m_FreqQue.size();
//初始化哈夫曼树共有2n-1个节点
delete[] m_HuffTree;
m_HuffTree=new HuffNode[iNode*2-1];
m_vValueKey.clear();
//初始化叶子节点
map::iterator iter=m_FreqQue.begin();
for (int i=0;iter!=m_FreqQue.end();++i++iter)
{
m_HuffTree[i].weight=iter->second;
m_HuffTree[i].value=iter->first;
m_HuffTree[i].code=0;
m_vValueKey[iter->first]=i;
}
//构造哈夫曼树haffTree的n-1个非叶结点
for(int i=0;i {
int m1=100000m2=100000; //Maxvalue=10000;(就是一个相当大的数)
int x1=0x2=0; //x1、x2是用来保存最小的两个值在数组对应的下标
//循环找出所有权重中,最小的二个值
for(int j=0;j {
if(m_HuffTree[j].weight {
m2=m1;
x2=x1;
m1=m_HuffTree[j].weight;
x1=j;
}
else if(m_HuffTree[j].weight {
m2=m_HuffTree[j].weight;
x2=j;
}
}
//将找出的两棵权值最小的子树合并为一棵子树
m_HuffTree[x1].bflag=true;
m_HuffTree[x2].bflag=true;
m_HuffTree[x1].code=0;
m_HuffTree[x2].code=1;
m_HuffTree[iNode+i].weight=m_HuffTree[x1].weight+m_HuffTree[x2].weight;
m_HuffTree[iNode+i].lchild=x1;
m_HuffTree[iNode+i].rchild=x2;
m_HuffTree[x1].parent=iNode+i;
m_HuffTree[x2].parent=iNode+i;
}
}
string CHufffMan::Code(const char* bufferunsigned int ilenint &iout)
{
string strContent=GetHuffTree();
string str;
for (unsigned int i=0;i {
map::iterator iter=m_vValueKey.find(buffer[i]);
if (iter!=m_vValueKey.end())
{
str+=GetCodeStr(iter->second);
while (str.size()>7)
{
bitset<8> bit(str.substr(08));
strContent+=static_cast(bit.to_ulong());;
str.erase(08);
}
}
}
iout=0;
if (!str.empty())
{
iout=8-str.size();
str.insert(str.size()iout‘0‘);
bitset<8> bit(str);
strContent+=static_cast(bit.to_ulong());
}
return strContent;
}
string CHufffMan::GetCodeStr(int iNode)
{
string str=ToString(m_HuffTree[iNode].code);
while (m_HuffTree[iNode].parent!=-1)
{
iNode=m_HuffTree[iNode].parent;
if (m_HuffTree[iNode].code!=-1)
{
str+=ToString(m_HuffTree[iNode].code);
}
}
reverse(str.begin()str.end());
return str;
}
string CHufffMan::GetHuffTree()
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4298 2014-10-23 14:24 HuffMan.cpp
文件 2216 2014-10-23 13:42 HuffMan.h
----------- --------- ---------- ----- ----
6514 2
相关资源
- c++ 数据结构 哈夫曼压缩&解压软件 控
- 哈夫曼压缩和解压c++源码
- 文件压缩程序基于哈夫曼C++算法
- 哈夫曼树MFC
- 哈夫曼编码译码器数据结构
- 哈夫曼编码压缩文件,c/c++课程设计
- 哈夫曼编码/译码器 完整版课程数据结
- 哈夫曼编码vc++6.0
- 用哈夫曼编码压缩文件
- 哈夫曼编码压缩c++版和QT5版 QT5版实现
- 香农费诺哈夫曼编码结果分析C++
- c++ 哈夫曼编译码器
- c++自适应哈夫曼编码
- 哈夫曼压缩与解压算法(可以直接运
- c语言哈夫曼编码及译码
- 游程哈夫曼编码结合
- c语言哈夫曼编码编码+译码,有注释
- 哈夫曼编码译码
- 哈夫曼树及其编码
- 对26个英文字母进行哈夫曼编码
- 哈夫曼编码解码的实现及运行截图C语
- 哈夫曼编码译码器绝对可以运行c语言
- 哈夫曼树设计——利用哈夫曼编码进
- 数据结构C语言之哈夫曼编码
- 自适应哈夫曼编码C++
- c语言哈夫曼树课程设计
- 哈夫曼树 C++算法
- 哈夫曼编码与解码(C语言实现)
- 用哈夫曼编码实现文件压缩代码+报告
- 哈夫曼编码译码器 C语言 数据结构课
评论
共有 条评论