?? 譯碼器源程序.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 + -