資源簡介
網(wǎng)上很多哈夫曼源代碼要不是復(fù)制,要不是對文件操作,無法對內(nèi)存緩沖區(qū)使用。自己寫了一個c++類封裝的,接口簡潔,方便使用,提供對緩沖區(qū)內(nèi)存的編碼和解碼,測試可行。但編碼和解碼時間較長,以后改進(jìn)。

代碼片段和文件信息
#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個節(jié)點
delete[]?m_HuffTree;
m_HuffTree=new?HuffNode[iNode*2-1];
m_vValueKey.clear();
//初始化葉子節(jié)點
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;
}
????//構(gòu)造哈夫曼樹haffTree的n-1個非葉結(jié)點?
????for(int?i=0;i {?
int?m1=100000m2=100000;?????//Maxvalue=10000;(就是一個相當(dāng)大的數(shù))?
int?x1=0x2=0;?????//x1、x2是用來保存最小的兩個值在數(shù)組對應(yīng)的下標(biāo)???
//循環(huán)找出所有權(quán)重中,最小的二個值
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;?
}?
}
//將找出的兩棵權(quán)值最小的子樹合并為一棵子樹?
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
評論
共有 條評論