📄 ac_code.cpp
字号:
// AC_Code.cpp: implementation of the CAC_Code class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "decompress.h"
#include "AC_Code.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAC_Code::CAC_Code()
{
}
CAC_Code::~CAC_Code()
{
Code.RemoveAll();
NewCode.RemoveAll();
DecodeFuHao.RemoveAll();
}
CAC_Code::CAC_Code(CString FuHao)
{
FuHaoZLS=FuHao.GetLength();
YuanFuHao=FuHao;
low=0;
high=1;
A=high-low;
sum=FuHaoZLS;
int i,k;
for(i=0;i<FuHaoZLS;i++)
FuHaoNum[i]=1;
Code.SetSize(5,5);
NewCode.SetSize(2,1);
DecodeFuHao.SetSize(5,5);
CodeId=0;
NewCodeId=0;
}
void CAC_Code::Four_Encode(BYTE fuhao) //四种符号PNZT的编码
{
double num,lowtemp,leijinum=0; //fuhao这一符号的个数和累积个数
int i,j,k,time=0;
int ilow,ihigh;
int ilast;
int cishu=14;
for(i=0;i<YuanFuHao.GetLength();i++)
{
if(fuhao==YuanFuHao.GetAt(i))
{
num=FuHaoNum[i];
for(j=0;j<i;j++)
leijinum+=FuHaoNum[j];
lowtemp=low;
A=high-low;
if(A<pow(10,-12))
{
ilow=(int)(low*10);
Code.SetAtGrow(CodeId,ilow);
CodeId++;
while(cishu>0)
{
Code.SetAtGrow(CodeId,9);
CodeId++;
cishu--;
}
lowtemp=low=0;
high=1;
A=1;
}
low=lowtemp+A*leijinum/sum;
high=lowtemp+A*(leijinum+num)/sum;
ilow=(int)(low*10);
ihigh=(int)(high*10);
if(ilow==ihigh)
{
while(ilow==ihigh)
{
Code.SetAtGrow(CodeId,ilow);
CodeId++;
low=low*10-ilow;
high=high*10-ihigh;
ilow=(int)(low*10);
ihigh=(int)(high*10);
time++;
}
if(time>=8)
{
ilast=((float)ilow+(float)ihigh)/2+0.5;
Code.SetAtGrow(CodeId,ilast);
CodeId++;
if(ilast==ihigh)
{
high=high*10-ihigh;
ihigh=(int)(high*10);
ilast=ihigh-1;
Code.SetAtGrow(CodeId,ilast);
CodeId++;
}
low=0;
high=1;
}
}
FuHaoNum[i]++;
sum++;
break;
}
}
}
void CAC_Code::Four_EncodeLast(BYTE fuhao)//四种符号PNZT的编码的最后部分
{
double num,lowtemp,leijinum=0; //fuhao这一符号的个数和累积个数
int i,j,k,kk;
int ilow,ihigh;
int ilast; //编码区间乘以10之后的整数部分
for(i=0;i<YuanFuHao.GetLength();i++)
{
if(fuhao==YuanFuHao.GetAt(i))
{
num=FuHaoNum[i];
for(j=0;j<i;j++)
leijinum+=FuHaoNum[j];
lowtemp=low;
A=high-low;
low=lowtemp+A*leijinum/sum;
high=lowtemp+A*(leijinum+num)/sum;
ilow=(int)(low*10);
ihigh=(int)(high*10);
if(ilow==ihigh)
{
while(ilow==ihigh)
{
Code.SetAtGrow(CodeId,ilow);
CodeId++;
low=low*10-ilow;
high=high*10-ihigh;
ilow=(int)(low*10);
ihigh=(int)(high*10);
}
}
ilast=((float)ilow+(float)ihigh)/2+0.5;
Code.SetAtGrow(CodeId,ilast);
CodeId++;
FuHaoNum[i]++;
sum++;
A=high-low;
break;
}
}
CodeIntoNewCode();
}
void CAC_Code::CodeIntoNewCode() //对前面得到的Code转化为二进制形的NewCode
{
int jinwei=0;//前一位的计算结果得来的进位
int i,j,l,k;
BYTE TempCode=0;
int tempgeshu=sum-FuHaoZLS;
if(tempgeshu>255)
{
TempCode=tempgeshu>>8;
NewCode.SetAtGrow(NewCodeId,TempCode);
NewCodeId++;
TempCode=tempgeshu;
NewCode.SetAtGrow(NewCodeId,TempCode);
NewCodeId++;
}
else
{
TempCode=0;
NewCode.SetAtGrow(NewCodeId,TempCode);
NewCodeId++;
TempCode=tempgeshu;
NewCode.SetAtGrow(NewCodeId,TempCode);
NewCodeId++;
}
if(CodeId%2==0)
{
for(i=0;i<CodeId;i++)
{
TempCode=Code.GetAt(i);
i++;
TempCode=TempCode*10+Code.GetAt(i);
NewCode.SetAtGrow(NewCodeId,TempCode);
NewCodeId++;
if(Code.GetAt(i)==10)
{
NewCode.SetAtGrow(NewCodeId,200);
NewCodeId++;
}
TempCode=0;
}
}
else
{
for(i=0;i<CodeId-1;i++)
{
TempCode=Code.GetAt(i);
i++;
TempCode=TempCode*10+Code.GetAt(i);
NewCode.SetAtGrow(NewCodeId,TempCode);
NewCodeId++;
if(Code.GetAt(i)==10)
{
NewCode.SetAtGrow(NewCodeId,200);
NewCodeId++;
}
TempCode=0;
}
TempCode=10*Code.GetAt(i);
NewCode.SetAtGrow(NewCodeId,TempCode);
NewCodeId++;
}
//Four_Decode();
}
void CAC_Code::Four_Decode(CArray <BYTE,BYTE> &Code) //对前面编码得到的NewCode进行解码
{
NewCode.Copy(Code);
NewCodeId=Code.GetSize();
low=0;
high=1;
A=1;
int BeforeId=0;
int GeShu=15;
int k,time=0;
char ilow,ihigh,iA; //编码区间乘以10之后的整数部分
BYTE CodeTemp;
BYTE code[18];
BYTE code1,code2,code3,code4,code5,code6,code7,code8,code9,code10,code11,code12,code13,code14,code15,code16,code17,codefornext;
long cd1,cd2,cd3,cd4,cd5,cd6,cd7,cd8;
double FuHaoQuJian[5];
double LeiJiNum=0;
sum=FuHaoZLS;
int i=0,j,m,n,s;
int index,index1,index2;
//int kk=0;
int DecodeFuHaoId=0; //解码符号表的下标
int tag=0,flag=0;
int geshu=GeShu;
int ilast;
double FloatCode=0;
int FuHaoShu;
FuHaoShu=NewCode.GetAt(0);
if(FuHaoShu==0)
FuHaoShu=NewCode.GetAt(1);
else
{
FuHaoShu=(FuHaoShu<<8)+NewCode.GetAt(1);
}
A=high-low; //区间范围
for(j=0;j<FuHaoZLS;j++)
FuHaoNum[j]=1;
DecodeFuHaoId=0;
for(j=0;j<FuHaoZLS+1;j++)
{
for(i=0;i<j;i++)
{
LeiJiNum+=FuHaoNum[i];
}
FuHaoQuJian[j]=low+A*LeiJiNum/sum;
LeiJiNum=0;
}
i=2;
for(index=1;index<=GeShu;index++)
{
if(flag==0)
{
CodeTemp=NewCode.GetAt(i);
i++;
code[index]=CodeTemp/10;
FloatCode+=code[index]*pow(10,-index);
flag=1;
tag=1;
}
else
{
code[index]=CodeTemp%10;
FloatCode+=code[index]*pow(10,-index);
flag=0;
tag=0;
}
}
codefornext=CodeTemp%10;
for(k=0;k<FuHaoZLS+1;k++)
{
if(DecodeFuHaoId<FuHaoShu)
{
while(FloatCode<=FuHaoQuJian[k] || k==FuHaoZLS)
{
DecodeFuHao.SetAtGrow(DecodeFuHaoId,YuanFuHao.GetAt(k-1));
DecodeFuHaoId++;
time=0;
low=FuHaoQuJian[k-1];
high=FuHaoQuJian[k];
FuHaoNum[k-1]++;
sum++;
ilow=(int)(10*low);
ihigh=(int)(10*high);
if(ilow==ihigh)
{
while(ilow==ihigh)
{
geshu--;
low=low*10-ilow;
high=high*10-ihigh;
ilow=(int)(low*10);
ihigh=(int)(high*10);
time++;
}
FloatCode=0;
if(time>=8)
{
time++;
geshu--;
ilast=((float)ilow+(float)ihigh)/2+0.5;
if(ilast==ihigh)
{
time++;
geshu--;
}
}
for(index1=1,index2=1+time;index2<=geshu+time;index1++,index2++)
{
code[index1]=code[index2];
}
if(tag==0)
{
flag=0;
while(i<NewCodeId && index1<=GeShu)
{
if(flag==0)
{
CodeTemp=NewCode.GetAt(i);
i++;
if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i)==200)
{
code[index1]=(CodeTemp-10)/10;
i++;
}
else
{
code[index1]=CodeTemp/10;
}
index1++;
flag=1;
tag=1;
}
else
{
if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
{
code[index1]=10;
}
else
{
code[index1]=CodeTemp%10;
}
index1++;
flag=0;
tag=0;
}
geshu++;
}
if(i==NewCodeId-1 && flag==0)
{
CodeTemp=NewCode.GetAt(i);
i++;
code[GeShu+1]=CodeTemp/10;
code[GeShu+2]=CodeTemp%10;
geshu=GeShu+2;
tag=0;
}
else if(i==NewCodeId && flag==1)
{
if(CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
code[GeShu+1]=10;
else
code[GeShu+1]=CodeTemp%10;
geshu=GeShu+1;
tag=0;
}
if(tag==1)
{
if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
codefornext=10;
else
codefornext=CodeTemp%10;
}
}
else
{
flag=0;
code[index1]=codefornext;
index1++;
geshu++;
tag=0;
while(i<=NewCodeId && index1<=GeShu)
{
if(flag==0 && i<NewCodeId)
{
CodeTemp=NewCode.GetAt(i);
i++;
if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i)==200)
{
code[index1]=(CodeTemp-10)/10;
i++;
}
else
{
code[index1]=CodeTemp/10;
}
index1++;
flag=1;
tag=1;
}
else
{
if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
{
code[index1]=10;
}
else
{
code[index1]=CodeTemp%10;
}
index1++;
flag=0;
tag=0;
}
geshu++;
}
if(i==NewCodeId-1 && flag==0)
{
CodeTemp=NewCode.GetAt(i);
i++;
code[GeShu+1]=CodeTemp/10;
code[GeShu+2]=CodeTemp%10;
geshu=GeShu+2;
tag=0;
}
else if(i==NewCodeId && flag==1)
{
if(CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
code[GeShu+1]=10;
else
code[GeShu+1]=CodeTemp%10;
geshu=GeShu+1;
tag=0;
}
if(tag==1)
{
if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
codefornext=10;
else
codefornext=CodeTemp%10;
}
}
for(index=1;index<=geshu;index++)
{
FloatCode+=code[index]*pow(10,-index);
}
}//if(ilow==ihigh)
if(time>=8)
{
low=0;
high=1;
}
A=high-low;
if(A<pow(10,-12))
{
for(index=1;index<=GeShu;index++)
code[index]=0;
for(index=GeShu+1;index<=geshu;index++)
code[index-GeShu]=code[index];
index=geshu-(GeShu-1);
geshu=geshu-GeShu;
if(tag==0)
{
flag=0;
while(i<NewCodeId && index<=GeShu)
{
if(flag==0)
{
CodeTemp=NewCode.GetAt(i);
i++;
if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i)==200)
{
code[index]=(CodeTemp-10)/10;
i++;
}
else
{
code[index]=CodeTemp/10;
}
flag=1;
tag=1;
index++;
geshu++;
}
else
{
if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
{
code[index]=10;
}
else
{
code[index]=CodeTemp%10;
}
flag=0;
tag=0;
index++;
geshu++;
}
}
if(i==NewCodeId-1 && flag==0)
{
CodeTemp=NewCode.GetAt(i);
i++;
code[index]=CodeTemp/10;
index++;
code[index]=CodeTemp%10;
index++;
geshu=geshu+2;
tag=0;
}
else if(i==NewCodeId && flag==1)
{
if(CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
code[index]=10;
else
code[index]=CodeTemp%10;
index++;
geshu++;
tag=0;
}
if(tag==1)
{
if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
codefornext=10;
else
codefornext=CodeTemp%10;
}
}
else
{
code[index]=codefornext;
index++;
flag=0;
geshu++;
while(i<NewCodeId && index<=GeShu)
{
if(flag==0)
{
CodeTemp=NewCode.GetAt(i);
i++;
if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i)==200)
{
code[index]=(CodeTemp-10)/10;
i++;
}
else
{
code[index]=CodeTemp/10;
}
flag=1;
tag=1;
index++;
geshu++;
}
else
{
if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
{
code[index]=10;
}
else
{
code[index]=CodeTemp%10;
}
flag=0;
tag=0;
index++;
geshu++;
}
}
if(i==NewCodeId-1 && flag==0)
{
CodeTemp=NewCode.GetAt(i);
i++;
code[index]=CodeTemp/10;
index++;
code[index]=CodeTemp%10;
index++;
geshu=geshu+2;
tag=0;
}
else if(i==NewCodeId && flag==1)
{
if(CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
code[index]=10;
else
code[index]=CodeTemp%10;
index++;
geshu++;
tag=0;
}
if(tag==1)
{
if(i<NewCodeId && CodeTemp%10==0 && NewCode.GetAt(i-1)==200)
codefornext=10;
else
codefornext=CodeTemp%10;
}
}
low=0;
high=1;
A=1;
FloatCode=0;
for(index=1;index<=geshu;index++)
{
FloatCode+=code[index]*pow(10,-index);
}
}
for(m=0;m<FuHaoZLS+1;m++)
{
for(n=0;n<m;n++)
{
LeiJiNum+=FuHaoNum[n];
}
FuHaoQuJian[m]=(long double)(low+A*LeiJiNum/sum);
LeiJiNum=0;
}
k=-1;
break;
} //while
}//if
else
break;
}//for
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -