資源簡(jiǎn)介
對(duì)算術(shù)編解碼的C++實(shí)現(xiàn),處理了有限精度下的編解碼 含主要部分注釋 已經(jīng)編譯好的所有文件 可直接運(yùn)行

代碼片段和文件信息
#include
#include
#include
using?namespace?std;
char*?intobi(long?doubleintchar*);
int?chartoint(char*intint*);
int?main()
{
int?ilsklenlen_resultcount=0;
double?difl1;
double?u=1l=0pc=1min=1;
double?*prob*fx;
char?*p*tag;
int?*p2=NULL;
string?alpha;
????string?seq;
//輸入源碼字符并根據(jù)源碼字符的長(zhǎng)度為概率和概率空間分布函數(shù)動(dòng)態(tài)分配內(nèi)存
cout<<“input?alpha:“< cin>>alpha;
len=alpha.length();
prob=new?double[len];
fx=new?double[len+1];
//輸入概率、需要編碼的序列和計(jì)算概率的分布函數(shù)
cout<<“input?prob?of?alpha:“< for?(i=0;i cin>>prob[i];
cout<<“input?seq:“< cin>>seq;
ls=seq.length();
fx[0]=0;
for?(i=0;i fx[i+1]=fx[i]+prob[i];
//根據(jù)需要編碼序列的長(zhǎng)度確定循環(huán)次數(shù)
//計(jì)算出現(xiàn)字符的概率乘積,以便得到編碼后的字符所需的動(dòng)態(tài)存儲(chǔ)空間長(zhǎng)度
for?(i=0;i {
for(int?j=0;j {
if?(seq[count]!=alpha[j])?
continue;
else?
pc=pc*prob[j];
count++;
break;
}
}
pc=1/pc;
int?wl=(int)(log(pc)/log(2))+2;
tag=new?char[wl+9];
count=0;
k=0;
//根據(jù)需要編碼序列的長(zhǎng)度確定循環(huán)次數(shù),并將編碼過(guò)程中出現(xiàn)的最小編碼區(qū)間間隔存儲(chǔ)于變量min中
//min用于解碼過(guò)程中得到正確解碼所需的最小長(zhǎng)度
while?(ls!=0)
{
dif=u-l;
if(dif min=dif;
//當(dāng)編碼區(qū)間完全落在[0?0.5)或者[0.5?1)時(shí),輸出對(duì)應(yīng)的字符0或1并變換編碼區(qū)間
if?(l>=0?&&?u<0.5)
{
tag[k]=48;
k++;
l=2*l;
u=2*u;
}
else?if?(l>=0.5?&&?u<1)
{
tag[k]=49;
k++;
l=2*(l-0.5);
u=2*(u-0.5);
}
//若編碼區(qū)間不完全落在給定區(qū)間,查找seq中字符在alpha中的位置,并賦值給j
//根據(jù)j更改編碼區(qū)間的上下限,同時(shí)將循環(huán)次數(shù)減1
else
{
for(int?j=0;j {
if?(seq[count]!=alpha[j])?
continue;
else???
break;
}
l1=l+(u-l)*fx[j];???
u=l+(u-l)*fx[j+1];
l=l1;
count++;
ls--;
}
}
//計(jì)算區(qū)分當(dāng)前字符串與其它字符串所需要的最小長(zhǎng)度,同時(shí)將編碼間隔的上限轉(zhuǎn)換為二進(jìn)制表示
p=new?char[wl-k+1];?
p=intobi(uwl-kp);
for(i=0;i tag[k+i]=p[i];
tag[wl]=‘\0‘;
//顯示最小編碼間隔,計(jì)算將字符串轉(zhuǎn)換為整數(shù)輸出時(shí)需要的長(zhǎng)度,動(dòng)態(tài)分配內(nèi)存存儲(chǔ)
cout<<“min=“< if(wl/8==0)
len_result=wl/8;
else?
len_result=wl/8+1;
p2=new?int[len_result];
chartoint(tagwlp2);
delete?p;
delete?p2;
delete?fx;
delete?prob;
delete?tag;
return?0;
}
//函數(shù)intobi將十進(jìn)制小數(shù)num轉(zhuǎn)換為count位的二進(jìn)制表示,并以字符串的形式存儲(chǔ)
//num為待轉(zhuǎn)換的十進(jìn)制小數(shù)
//count為轉(zhuǎn)換以后得到的二進(jìn)制表示的長(zhǎng)度
//*p為轉(zhuǎn)換結(jié)束后存儲(chǔ)的轉(zhuǎn)換結(jié)果,返回到主函數(shù)被使用
char*?intobi(long?double?numint?countchar?*p)?
{
int?ij;
for(j=0;j {?
num=num*2;
if(num>1)
{
i=1;
num=num-1;
}
else?
{
i=0;
}
*(p+j)=i+48;
}
*(p+count)=‘\0‘;
return(p);
}?
//%函數(shù)char2int將字符串轉(zhuǎn)換為無(wú)符號(hào)8位整數(shù),每8位進(jìn)行一次處理
//*p為需要轉(zhuǎn)換的字符串
//*p2為轉(zhuǎn)換后得到的整數(shù)
//count為字符串*p的長(zhǎng)度
int?chartoint(char?*?pint?countint?*p2)??
{????????????????????????????????
int?ikmnmnll;
int?res=0l=0;
//將輸入序列長(zhǎng)度對(duì)8取余,如果余數(shù)不為0則補(bǔ)0使得輸入序列長(zhǎng)度是8的整數(shù)
n=count%8;
if?(n!=0)???????????????????????
{
for(i=0;i<8-n;i++)
*(p+count+i)=‘0‘;
*(p+count+8-n)=‘\0‘;
}
//對(duì)字符串進(jìn)行8位處理,如果處理完8位則將相應(yīng)的整數(shù)存入指針p2中
ll=strlen(p);
for(i=1;i<=ll;i++)?????????
{
k=i%8;
if(k!=0)
{
m=*p;
n=(int)((m-48)*pow(2(8-k)));
?屬性????????????大小?????日期????時(shí)間???名稱(chēng)
-----------?---------??----------?-----??----
?????文件???????3840??2010-05-06?14:43??算術(shù)編碼C++源代碼\code??C\code.cpp
?????文件???????3377??2010-05-06?14:40??算術(shù)編碼C++源代碼\code??C\code.dsp
?????文件????????516??2010-05-06?14:43??算術(shù)編碼C++源代碼\code??C\code.dsw
?????文件??????41984??2010-05-06?14:43??算術(shù)編碼C++源代碼\code??C\code.ncb
?????文件??????48640??2010-05-06?14:43??算術(shù)編碼C++源代碼\code??C\code.opt
?????文件????????734??2010-05-06?14:40??算術(shù)編碼C++源代碼\code??C\code.plg
?????文件?????577585??2010-05-06?14:40??算術(shù)編碼C++源代碼\code??C\Debug\code.exe
?????文件?????808416??2010-05-06?14:40??算術(shù)編碼C++源代碼\code??C\Debug\code.ilk
?????文件?????266233??2010-05-06?14:40??算術(shù)編碼C++源代碼\code??C\Debug\code.obj
?????文件????2087540??2010-05-06?13:09??算術(shù)編碼C++源代碼\code??C\Debug\code.pch
?????文件????1115136??2010-05-06?14:40??算術(shù)編碼C++源代碼\code??C\Debug\code.pdb
?????文件??????91136??2010-05-06?14:41??算術(shù)編碼C++源代碼\code??C\Debug\vc60.idb
?????文件?????135168??2010-05-06?14:40??算術(shù)編碼C++源代碼\code??C\Debug\vc60.pdb
?????文件???????4045??2010-05-06?14:19??算術(shù)編碼C++源代碼\decode??C\decode.cpp
?????文件???????3401??2010-05-06?14:24??算術(shù)編碼C++源代碼\decode??C\decode.dsp
?????文件????????520??2010-05-06?14:26??算術(shù)編碼C++源代碼\decode??C\decode.dsw
?????文件??????41984??2010-05-06?14:26??算術(shù)編碼C++源代碼\decode??C\decode.ncb
?????文件??????48640??2010-05-06?14:26??算術(shù)編碼C++源代碼\decode??C\decode.opt
?????文件????????744??2010-05-06?14:24??算術(shù)編碼C++源代碼\decode??C\decode.plg
?????文件?????266385??2010-05-06?14:19??算術(shù)編碼C++源代碼\decode??C\Debug\code.obj
?????文件?????573492??2010-05-06?14:24??算術(shù)編碼C++源代碼\decode??C\Debug\decode.exe
?????文件?????804772??2010-05-06?14:24??算術(shù)編碼C++源代碼\decode??C\Debug\decode.ilk
?????文件?????222832??2010-05-06?14:24??算術(shù)編碼C++源代碼\decode??C\Debug\decode.obj
?????文件????2325928??2010-05-06?14:19??算術(shù)編碼C++源代碼\decode??C\Debug\decode.pch
?????文件????1106944??2010-05-06?14:24??算術(shù)編碼C++源代碼\decode??C\Debug\decode.pdb
?????文件??????99328??2010-05-06?14:24??算術(shù)編碼C++源代碼\decode??C\Debug\vc60.idb
?????文件?????135168??2010-05-06?14:19??算術(shù)編碼C++源代碼\decode??C\Debug\vc60.pdb
?????目錄??????????0??2010-05-06?14:43??算術(shù)編碼C++源代碼\code??C\Debug
?????目錄??????????0??2010-05-06?14:43??算術(shù)編碼C++源代碼\decode??C\Debug
?????目錄??????????0??2010-05-06?14:43??算術(shù)編碼C++源代碼\code??C
............此處省略5個(gè)文件信息
評(píng)論
共有 條評(píng)論