资源简介
对算术编解码的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个文件信息
相关资源
- 我用VS2010 C++和windows API制作的坦克大
- C++开发漂亮的软件界面
- vc++收发电子邮件系统
- C++ CAsyncSocket类聊天室程序
- C++课程设计 学籍管理系统82049
- mfc酒店管理系统C++编写,程序简单,
- C++编写Genesis200自动化
- C++实现线程池源文件
-
最简单的c++ xm
l类,跨平台使用 - c++ 、MFC 实现中点画圆算法及工程代码
- 用C++语言编写一个班级信息管理系统
- VC++ 球体 Phong光照模型
- VC6.0--计算器
- C、C++、C# 函数手册合集chm
- 用c++写的曲线拟合程序
- C+++视频监控系统.zip
- CACertification Authoritcationc++源代码
- funcode.c++弹弹堂游戏程序及源代码
- 哈夫曼编码vc++6.0
- VC++6.0 MFC使用ODBC链接MySQL把图片写入
- C++浏览器.rar
- Visual C++编程技巧典型案例解析
- Visual C++编程全能词典破解文件
- OpenGL三维图形程序设计及源码 c++
- QQ农场源代码C++版
- C++课程设计报告(人事管理系统).
- c++写的迷宫
- Qt版推箱子源码-鼠标键盘功能都有
- C++ GUI Qt 4编程第二版随书源码
- 人工智能归结反演c++代码
评论
共有 条评论