资源简介

对算术编解码的C++实现,处理了有限精度下的编解码 含主要部分注释 已经编译好的所有文件 可直接运行

资源截图

代码片段和文件信息

#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;
//输入源码字符并根据源码字符的长度为概率和概率空间分布函数动态分配内存
cout<<“input alpha:“< cin>>alpha;
len=alpha.length();
prob=new double[len];
fx=new double[len+1];
//输入概率、需要编码的序列和计算概率的分布函数
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];
//根据需要编码序列的长度确定循环次数
//计算出现字符的概率乘积,以便得到编码后的字符所需的动态存储空间长度
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;
//根据需要编码序列的长度确定循环次数,并将编码过程中出现的最小编码区间间隔存储于变量min中
//min用于解码过程中得到正确解码所需的最小长度
while (ls!=0)
{
dif=u-l;
if(dif min=dif;
//当编码区间完全落在[0 0.5)或者[0.5 1)时,输出对应的字符0或1并变换编码区间
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);
}
//若编码区间不完全落在给定区间,查找seq中字符在alpha中的位置,并赋值给j
//根据j更改编码区间的上下限,同时将循环次数减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--;
}
}
//计算区分当前字符串与其它字符串所需要的最小长度,同时将编码间隔的上限转换为二进制表示
p=new char[wl-k+1]; 
p=intobi(uwl-kp);
for(i=0;i tag[k+i]=p[i];
tag[wl]=‘\0‘;
//显示最小编码间隔,计算将字符串转换为整数输出时需要的长度,动态分配内存存储
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;
}
//函数intobi将十进制小数num转换为count位的二进制表示,并以字符串的形式存储
//num为待转换的十进制小数
//count为转换以后得到的二进制表示的长度
//*p为转换结束后存储的转换结果,返回到主函数被使用
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);

//%函数char2int将字符串转换为无符号8位整数,每8位进行一次处理
//*p为需要转换的字符串
//*p2为转换后得到的整数
//count为字符串*p的长度
int chartoint(char * pint countint *p2)  
{                                
int ikmnmnll;
int res=0l=0;
//将输入序列长度对8取余,如果余数不为0则补0使得输入序列长度是8的整数
n=count%8;
if (n!=0)                       
{
for(i=0;i<8-n;i++)
*(p+count+i)=‘0‘;
*(p+count+8-n)=‘\0‘;
}
//对字符串进行8位处理,如果处理完8位则将相应的整数存入指针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)));

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       3840  2010-05-06 14:43  算术编码C++源代码\code  C\code.cpp

     文件       3377  2010-05-06 14:40  算术编码C++源代码\code  C\code.dsp

     文件        516  2010-05-06 14:43  算术编码C++源代码\code  C\code.dsw

     文件      41984  2010-05-06 14:43  算术编码C++源代码\code  C\code.ncb

     文件      48640  2010-05-06 14:43  算术编码C++源代码\code  C\code.opt

     文件        734  2010-05-06 14:40  算术编码C++源代码\code  C\code.plg

     文件     577585  2010-05-06 14:40  算术编码C++源代码\code  C\Debug\code.exe

     文件     808416  2010-05-06 14:40  算术编码C++源代码\code  C\Debug\code.ilk

     文件     266233  2010-05-06 14:40  算术编码C++源代码\code  C\Debug\code.obj

     文件    2087540  2010-05-06 13:09  算术编码C++源代码\code  C\Debug\code.pch

     文件    1115136  2010-05-06 14:40  算术编码C++源代码\code  C\Debug\code.pdb

     文件      91136  2010-05-06 14:41  算术编码C++源代码\code  C\Debug\vc60.idb

     文件     135168  2010-05-06 14:40  算术编码C++源代码\code  C\Debug\vc60.pdb

     文件       4045  2010-05-06 14:19  算术编码C++源代码\decode  C\decode.cpp

     文件       3401  2010-05-06 14:24  算术编码C++源代码\decode  C\decode.dsp

     文件        520  2010-05-06 14:26  算术编码C++源代码\decode  C\decode.dsw

     文件      41984  2010-05-06 14:26  算术编码C++源代码\decode  C\decode.ncb

     文件      48640  2010-05-06 14:26  算术编码C++源代码\decode  C\decode.opt

     文件        744  2010-05-06 14:24  算术编码C++源代码\decode  C\decode.plg

     文件     266385  2010-05-06 14:19  算术编码C++源代码\decode  C\Debug\code.obj

     文件     573492  2010-05-06 14:24  算术编码C++源代码\decode  C\Debug\decode.exe

     文件     804772  2010-05-06 14:24  算术编码C++源代码\decode  C\Debug\decode.ilk

     文件     222832  2010-05-06 14:24  算术编码C++源代码\decode  C\Debug\decode.obj

     文件    2325928  2010-05-06 14:19  算术编码C++源代码\decode  C\Debug\decode.pch

     文件    1106944  2010-05-06 14:24  算术编码C++源代码\decode  C\Debug\decode.pdb

     文件      99328  2010-05-06 14:24  算术编码C++源代码\decode  C\Debug\vc60.idb

     文件     135168  2010-05-06 14:19  算术编码C++源代码\decode  C\Debug\vc60.pdb

     目录          0  2010-05-06 14:43  算术编码C++源代码\code  C\Debug

     目录          0  2010-05-06 14:43  算术编码C++源代码\decode  C\Debug

     目录          0  2010-05-06 14:43  算术编码C++源代码\code  C

............此处省略5个文件信息

评论

共有 条评论