hdb3编解码源程序(可能有bug,希望大家雅正)
程序代码:#include<stdio.h>
#include<math.h>
//计算数据串的长度
int convert(char *str)
{for(int i=0;str[i]!='\0';i++)
{}
return i;}
//void jiaoti(char*str,int m,int i,int *c)
//{
//int t=i+1;
//m=m+c[i];
//if(str[m]==str[m-1])}
//编码
void encoding(char *str)
{int i=0,m=0,n=1,b=0,sum=0;
int c[10000]={0},t[10000]={0};
int len=convert(str);
for(i;str[i]!='\0';i++)//编成AMI码
{str[i]=str[i]-48;
if(str[i]==1)
{str[i]=pow(-1,m);
m++;
b++;
t[m]=b;//记录两个相邻的超过四个零的0组之间1的个数
n=1;}
else
{
c[m]=n;//记录0的个数
n++;
if(c[m]>3)
b=0;}
}
//当前面大于4个零时
if(c[0]>3)
{ if(c[0]<8)
{str[0]=1;//第一个零为1
str[3]=str[0];//第四个零为1
//后面的传号码交替
int t=1;
m=0;
m=m+c[0];
if(str[m]==str[m-c[0]+3])
{str[m]=(-1)*str[m];
for(m;c[t]<4;)
{m=m+c[t]+1;
str[m]=(-1)*str[m];
t++;}}
}
else//当前面的零为8个时
{str[0]=1;
str[3]=str[0];
str[4]=(-1)*str[3];
str[7]=str[4];
}
sum=sum+c[0];
}
for(i=1;i<len;i++)
{
if(c[i]<4)
sum=sum+c[i];//记录在0前面的0的总数
else
if(c[i]<8)//小于8个0
{int n=1;
for(n;n<i;)
if(c[n]<4)
n++;
else break;
if(n<i&&t[i]%2==0)//前面有偶数个1
{m=sum+i;//定位1
str[m]=(-1)*str[m-1];
str[m+3]=str[m];
//后面的数交替
int t=i+1;
m=m+c[i];
if(str[m]==str[m-c[i]+3])
{str[m]=(-1)*str[m];
for(m;c[t]<4;)
{
{m=m+c[t]+1;
str[m]=(-1)*str[m];
t++;}}
sum=sum+c[i];}}
else//前面有奇数个1(包括第一数为1时第一个大于四个零的零组前面有偶数个1的情况)
{m=sum+i;
str[m+3]=str[m-1];sum=sum+c[i];}
}
else//等于8
{ int n=1;
for(n;n<i;)
if(c[n]<4)
n++;
else break;
if(n<i&&t[i]%2==0)//前面有偶数个1
{ m=sum+i;
str[m]=(-1)*str[m-1];
str[m+3]=str[m];
str[m+4]=(-1)*str[m+3];
str[m+7]=str[m+4];
/*for(m=m+c[i];str[m]!=0;m++)
{
str[m]=(-1)*str[m-c[i]+7];}*/
sum=sum+c[i];}
else//前面有奇数个1(包括第一数为1时第一个大于四个零的零组前面有偶数个1的情况)
{ m=sum+i;
str[m+3]=str[m-1];
str[m+4]=(-1)*str[m+3];
str[m+7]=str[m+4];
//后面的数交替
int t=i+1;
m=m+c[i];
if(str[m]==str[m-1])
{str[m]=(-1)*str[m];
for(m;c[t]<4;)
{
{m=m+c[t]+1;
str[m]=(-1)*str[m];
t++;}}
}
sum=sum+c[i];}}
}
}
//解码程序
void decoding(char *str,int len)
{
int i=0,n=1;
for(i;i<len;i++)//把字符对应的数值化为整数1,0,-1
{if(str[i]!=45)
{str[i]=str[i]-48;}
else
{str[i]=-1;
int t=i+1;
for(t;t<len;t++)
{str[t]=str[t+1];}
len--;}}
//开始解码
for(i=0;i<len;i++)
{
if(pow(str[i],2)==1)//当这个数和他的后面的第三个数相同时。这两个数都是零
{if(str[i]==str[i+3])
{str[i]=0;
str[i+3]=0;}
else
if(str[i+3]==0&&str[i]==str[i+4])//当这个数和他后面第四个数相同且第三个数为零时第四个数为零
str[i+4]=0;}}
for(i=0;i<len;i++)
{str[i]=pow(str[i],2);}
//输出自然码
for(i=0;i<len;i++)
{printf("%d ",str[i]);}
}
int main()
{char str[10000];//={'1','0','0','0','1','0','0','0','0','0','0','0','0','1','1'};
printf(" *************************************************************\n");
printf(" * *\n");
printf(" * HDB3编解码程序 *\n");
printf(" * *\n");
printf(" *************************************************************\n");
printf(" 作者:天际\n\n ");
printf(" 版权所有,如有雷同,纯属偶然\n");
start:printf("操作方法:\n");
printf("\n");
printf("1.编码 2. 解码 3. 推出 \n\n");
printf("请输入任务编号:");
int len;
char c[1000];
scanf("%s",c);
if(c[0]==49)
{printf("请输入自然码:");
scanf("%s",&str);
len=convert(str);
encoding(str);
printf("HDB3码为:");
for(int i=0;i<len;i++)
{printf("%d ",str[i]);}
printf("\n");
goto start;}
else
if(c[0]==50)
{printf("HDB3码为:");
scanf("%s",&str);
printf("\n");
len=convert(str);
printf("自然码为:");
decoding(str,len);
goto start;}
else
if(c[0]==51)
return 0;
}

