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

📄 译码器源程序.txt

📁 很不错的信息论与编码课程设计论文
💻 TXT
字号:
//译码程序
//接受文档中二进制的字符串,并将其译码,得到一串字符串
//运行正常
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "iostream.h"
//////////////////////////////////
//////////////////////////////////
int change(int x)//八位以下的伪十进制数转化为真十进制数
  {
   int i,y=0,j=1,k=1;
   if(x>11111111)//超过8位就退出
	   exit(-1);
   for(i=0;i<8;i++)//求十进制数,用y表示 
	  {
      y+=k*((x/j)%10);
      j=j*10;
	  k=2*k;
	  }
    return y;
  }
////////////////////////////////////
////////////////////////////////////
void translate(char *s)
{
	int i=0,j=0,z;
	char * mark1,* mark2,*flag;//均为标记指针
	char *tchar;//存放字母
	int n;
	flag=s;
	char *mid="00000001"; //分隔符号
    mark1=strstr(s,mid);//找标记的首地址
    while((flag+j)!=mark1)//累计当前地址到标记地址间的字符个数
	   j++;
    char *ctemp;
	////////////////////////////////////////////////////////
	//////////////////////////////////////译出字符的种类数
	ctemp=(char *)malloc((j+1)*sizeof(char));//开辟堆空间
	for(i=0;i<j;i++)
     ctemp[i]=flag[i];
     ctemp[j]='\0';
     n=atoi(ctemp);//二进制整数(字符个数)
	 n=change(n);//字符的种类数
	 //////////////////////////////////////////////////////
     ////////////////////////////////////////译出出现的字符
	 tchar=(char *)malloc((n+1)*sizeof(char));//存放字符
	 char **bm=(char **)malloc(n*sizeof(char *));//存放小编码指针
	 for(z=0;z<n;z++)//没问题
	 { j=0;
	 mark2=mark1+8;//00000001后标记
	 flag=mark2;
	 mark1=strstr(mark2,mid);//找标记的首地址
	   while((mark2+j)!=mark1)
	    j++;
	     free(ctemp);//释放堆空间
		  ctemp=(char *)malloc((j+1)*sizeof(char));//再次开辟空间
	   for(i=0;i<j;i++)
	     ctemp[i]=flag[i];//求表示字母ASCII码的二进制编码串
	     ctemp[j]='\0';
     
		 tchar[z]=(char)change(atoi(ctemp));//译出的字母存入数组中
	 }
    //mark1此时指向00000001前了
     ///////////////////////////////////////////////////////
	 //////////////////////////////////
	 char *temp;
  for(z=0;z<n;z++)//产生小编码字符串(不是字母编码的代码)
  {
	 j=0;
	 mark2=mark1+8;//让mark2指向标记后
     flag=mark2;
	 mark1=strstr(mark2,mid);//找标记的首地址
	 
	 if(mark1==mark2)//当编码为分隔标记符时另外考虑
	 {	 mark1+=8;
	 mark1=strstr(mark1,mid);
	 }
	 while((mark2+j)!=mark1)
      j++;
	  temp=(char *)malloc((j+1)*sizeof(char));
      for(i=0;i<j;i++)
	  temp[i]=flag[i];//用临时指针指向编码
	  temp[j]='\0';//串尾终止符
	  bm[z]=temp;//将每个字符的哈夫曼编码存入bm堆中
  }
	 /////////////////////////////////////////////////
	 ///////////////////////////////////
      mark2=mark1+8;
	 i=0;
    char *information=(char *)malloc(sizeof(char));//存放最后翻译出来的字符串
	while(mark2[0]!='\0')//终止标志
	{  
	   for(j=0;j<n;j++)
	   {
		 temp=strstr(mark2,bm[j]);//查找标记首地址
	       if(temp==mark2)
		   {  mark2+=strlen(bm[j]);
	          information[i]=tchar[j];
			  break;
		   }
	   }
	   i++;
	  information=(char *)realloc(information,(i+1)*sizeof(char));
	  //将字符串存入information中
	}
	 information[i]='\0';
	 ////////////////////////////////////////////将最后翻译出来的字符串写入文件中	
	 FILE *fp2;
	if((fp2=fopen("译码后的字符串.txt","wt+"))==NULL)
  {
  printf("error!");
  exit(-1);
  }
     fwrite(information,sizeof(char),i+1,fp2);//将information写入文档中 
     free(information);//释放堆空间
	 fclose(fp2);
}
/////////////////////////////////////// 
void main()
{
FILE *fp;
char s[2000];
if((fp=fopen("字符串的二进制编码.txt","rt"))==NULL)
  {
  printf("error!");
  exit(-1);
  }
fread(s,sizeof(char),2000,fp);
system("字符串的二进制编码.txt");//打开读入的二进制文本文档
translate(s);//进行译码操作
system("译码后的字符串.txt");//打开该文本文档
fclose(fp);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -