⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 算术编码程序.txt

📁 图形图像处理中常用的编码
💻 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 + -