linux上用c实现算术编码(二)--具体代码
转载注明出处:http://blog.csdn.net/wang_zheng_kai
让学生用开发工具,练习学到的数据压缩编码
本文包括两部分:
linux上用c实现算术编码(一)--具体操作
linux上用c实现算术编码(二)--具体代码
/********************************* ***Arithmetic coding fixed mode*** *****Writed By Wang Zhengkai****** ***********2014.11.24************* **********************************/ #include<stdio.h> #include<math.h> #include<string.h> char c[20],s[100]; float p[20],f[20],len; int cord[100]; /************************************** * **************encord**************** * ***********************************/ void encord(int a,int h) { float Fr; float Ps=1; float Fs=0; float cp[100]; int i,j; for(i=0;i<h;i++) { for(j=0;j<a;j++) { if(s[i]==c[j]) { cp[i]=p[j]; Fr=f[j]; } } Fs=Fs+Ps*Fr; Ps*=cp[i]; } printf("The result of encord: %f\n",Fs); len=log(1/Ps)/log(2); if(len>(int)len) len=(int)len+1; else len=(int)len; for(i=0;len>i;i++) { Fs=2*Fs; if(Fs>1) { Fs=Fs-1; cord[i]=1; } else if(Fs<1) cord[i]=0; else { cord[i]=1; break; } } if(i>=len) { for(j=i;j>=1;j--) { cord[j-1]=(cord[j-1]+1)%2; if(cord[j-1]==1) break; } } printf("The resault of encord:\n"); for(j=0;j<i;j++) printf("%d ",cord[j]); printf("\n"); } /************************************** * **************decord**************** * ***********************************/ void decord(int a,int h) { int i,j; float Ft,Pt,w=0.5,result=0; float Fs=0,Ps=1; for(i=0;i<len;i++,w*=0.5) //two_to_ten result += w*cord[i]; printf("Select the number of decode: %f\n",result); printf("The result of decord:\n"); for(i=0;i<h;i++) { for(j=a;j>0;j--) { Ft=Fs; Pt=Ps; Ft+=Pt*f[j-1]; Pt*=p[j-1]; if(result>=Ft) { Fs=Ft; Ps=Pt; printf("%c ",c[j-1]); break; } } } printf("\n"); } int main(void) { int num,i,h=0; char rub; /************************************** * ****input num of symbols************ * ***********************************/ printf("Please input num of character!\n"); if(1==scanf("%d", &num)) { // printf("%d\n",num); rub=getchar(); } else { rewind(stdin); printf("num:input error!\n"); } /************************************** * ***input sybmol and values********** * ***********************************/ printf("Please input character symbols and their probability values of corresponding!\n"); for(i=0;i<num;i++) { printf("Please input character symbols!\n"); scanf("%c", &c[i]); printf("Please input probability values of corresponding!\n"); scanf("%f", &p[i]); rub=getchar(); } for(i=0;i<num;i++) { printf("<%d>----> %c ",i,c[i]); } printf("\n"); for(i=0;i<num;i++) { printf("<%d>----> %f ",i,p[i]); } printf("\n"); for(i=1;i<num;i++) { f[0]=0; f[i]=f[i-1]+p[i-1]; } /************************************** * ******input encord symbol*********** * ***********************************/ printf("Please input encord symbols,and input * to exit!\n"); while(1) { char ss; scanf("%c", &ss); rub=getchar(); if(ss=='*')break; s[h++]=ss; } printf("The numbers of input\n"); for(i=0;i<h;i++) { printf("%c ",s[i]); } printf("\n"); /************************************** * *******encord and dedord************ * ***********************************/ printf("............encord............\n "); encord(num,h); printf("............decord............\n "); decord(num,h); return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。