?? 算術編碼程序.txt
字號:
算術編碼程序
編碼程序
#include <stdio.h>
#include <stdlib.h>
FILE *charsetfile;
FILE *inputfile;
FILE *outputfile;
typedef struct{
double l;
double r;
}Interval;
void main()
{
int i,j,len,num;
double *p,c;
char chfile[10],infile[10],out[10],cur;
Interval *itvl;
printf("Enter the character set file name:\n");
scanf("%s",chfile);
printf("Enter the inputfile name:\n");
scanf("%s",infile);
printf("Enter the outputfile name:\n");
scanf("%s",outfile);
if((charsetfile=fopen(chfile,"r"))==NULL)
{
printf("cannot open the character set file\n");
exit(0);
}
if((inputfile=fopen(infile,"rb"))==NULL)
{
printf("cannot open the inputfile\n");
exit(0);
}
if((outputfile=fopen(infile "wb"))==NULL)
{
printf("cannot open the outputfile\n");
exit(0);
}
//讀取已知num個字符所出現的概率
num=0;
while(!feof(charsetfile))
{
cur=fgetc(charsetfile);
num++;
}
if(num<=1) return;
p=(double *)malloc(num *sizeof(double));
fread(p,8,num,inputfile);
fread(&len,2,1,inputfile);
fread(&c,8,1,inputfile);
//計算初始間隔
itvl=(Interval *)malloc(num *sizeof(Interval));
itvl[0].l=0;
itvl[0].r=p[0];
for(i=1;i<=num;i++)
{
itvl[i].l=itvl[i-1].r;
itvl[i].r=itvl[i].l+p[i];
}
//解碼
for(i=0;i<len;i++)
{
for(j=0;j<num;j++)
if(c>=itvl[j].l&&c<itvl[j].r)
break;
cur=fgetc(charsetfile+fseek(charsetfile,j,0));
fwrite(&cur,1,1,outputfile);
c=(c-itvl[j].l)/p[j];
}
fclose(charsetfile);
fclose(inputfile);
fclose(outputfile);
}
解碼程序
#include<stdio.h>
#include<stdlib.h>
FILE *charsetfile;
FILE *inputfile;
FILE *outputfile;
typedef struct{
double l;
double r;
}Interval;
void main()
{
int i,len,num;
double *p,left,right,ltemp;
char chfile[10],infile[10],out[10],cur;
Interval *itvl;
printf("Enter the character set file name:\n");
scanf("%s",chfile);
printf("Enter the inputfile name:\n");
scanf("%s",infile);
printf("Enter the outputfile name:\n");
scanf("%s",outfile);
if((charsetfile=fopen(chfile,"r"))==NULL)
{
printf("cannot open the character set file\n");
exit(0);
}
if((inputfile=fopen(infile,"r"))==NULL)
{
printf("cannot open the inputfile\n");
exit(0);
}
if((outputfile=fopen(infile "wb"))==NULL)
{
printf("cannot open the outputfile\n");
exit(0);
}
//計算已知num個字符所出現的概率
num=0;
while(!feof(charsetfile))
{
cur=fgetc(charsetfile);
num++;
}
p=(double *)malloc(num *sizeof(double));
for(i=0;i<num;i++)
p[i]=0;
len=0;
fseek(charsetfile,0,0);
while(!feof(inputfile))
{
cur=fgetc(inputfile);
for(i=0;i<num;i++)
{
if(cur==fgetc(charsetfile+fseek(charsetfile,i,0)))
break;
}
p[i]+=1;
len++;
}
for(i=0;i<num;i++)
p[i]=p[i]/len;
//計算初始間隔
itvl=(Interval *)malloc(num) * sizeof(Interval));
itvl[0].l=0;
itvl[0].r=p[0];
for(i=1;i<=num;i++)
{
itvl[i].l=itvl[i-1].r;
itvl[i].r=itvl[i].l+p[i];
}
//編碼
fseek(inputfile,0,0);
fseek(charsetfile,0,0);
len=0;
while(!feof(inputfile))
{
cur=fgetc(inputfile);
for(i=0;i<num;i++)
{
if(cur==fgetc(charsetfile+fseek(charsetfile,i,0)))
break;
}
if(len==0)
{
left=itvl[i].l;
right=itvl[i].r;
}
else
{
ltemp=left;
left=left+right*itvl[i].l;
right=ltemp+right*itvl[i].r-left;
}
len++;
}
//輸出編碼結果
fwrite(p,8,num,outputfile);
fwrite(&len,2,1,outputfile);
fwrite(&left,8,1,outputfile);
fclose(charsetfile);
fclose(inputfile);
fclose(outputfile);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -