📄 算术编码程序.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 + -