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; }