📄 译码器源程序.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 + -