📄 crc.txt
字号:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
void createCRC()
{int b[4],c[8],d[35],e[35];
char a[35],f[1];/*a字符串由用户输入需编辑的码字,b字符串表示生成多项式,由系统确定*/
int i,j,code=0,create=0,m,n,l,k,g;
printf("本系统的生成多项式为4位\n");
printf("请输入字长为小于32位的需编码码字:");
gets(f);
gets(a);
printf("将码字左移3位\n");
printf("%s\n",a);
for(i=0;i<32;i++)
if(a[i]!='1'&&a[i]!='0')break;
g=i-1;
for(i=0;i<=g;i++)
{a[i]=a[i]-48;
d[i]=a[i];
}
for(i=g+1;i<=g+3;i++)
a[i]=0;
for(i=g+3;i>=0;i--)
e[i]=a[i];
for(j=0;j<=g+3;j++)
printf("%d ",e[j]);
printf("\n");
b[0]=1;b[1]=1;b[2]=0;b[3]=1;
for(j=3;j>=0;j--)
printf("%d",b[j]);
printf("\n");
for(i=0;i<4;i++)
{e[i]=e[i]*pow(2,3-i);
printf("%d ",e[i]);
}
printf("\n");
for(i=0;i<4;i++)
code=code+e[i];
printf("%d\n",code);
for(j=0;j<4;j++)
{b[j]=b[j]*pow(2,j);
}
for(j=3;j>=0;j--)
printf("%d ",b[j]);
printf("\n");
for(j=0;j<4;j++)
create=create+b[j];
printf("%d\n",create);
m=3;
do
{n=code^create;
printf("%d\n",n);
for(j=0;j<4;j++)
c[j]=0;
for(j=0;n!=0;)
{c[j]=n%2;
printf("%d ",c[j]);
n=n/2;
j++;
}
printf("\n");
j=3;
while(c[j]==0)
j--;
if(j==3)
{code=0;
for(j;j>=0;j--)
c[j]=c[j]*pow(2,j);
for(j=3;j>=0;j--)
code=code+c[j];
printf("code1=%d\n",code);
}
else
{
i=j;n=3-j;k=m;
code=0;
if(m+n<=g+3)
{for(i;i>=0;i--)
c[i]=c[i]*pow(2,i+n);
for(j;j>=0;j--)
code=code+c[j];
printf("code2=%d\n",code);
for(j=m+n,l=n-1;j>m;j--,l--)
e[j]=e[j]*pow(2,n-1-l);
for(j=m+n;j>m;j--)
code=code+e[j];
printf("code3=%d\n",code);
}
else
{for(i;i>=0;i--,k--)
c[i]=c[i]*pow(2,g+3-k);
for(j;j>=0;j--)
code=code+c[j];
for(j=g+3,l=n-1;j>m;j--,l--)
{e[j]=e[j]*pow(2,n-1-l);
printf("%d ",e[j]);}
printf("\n");
for(j=g+3;j>m;j--)
code=code+e[j];
printf("code4=%d\n",code);
}
m=m+n;
}
}while(m<=g+3);
printf("%d\n",code);
for(j=0;j<4;j++)
c[j]=0;
for(j=0;code!=0;)
{c[j]=code%2;
code=code/2;
printf("%d!!\n",code);
j++;
}
for(i=0;i<3;i++)
printf("%d",c[i]);
printf("\n");
for(i=g+1,j=2;i<=g+3,j>=0;i++,j--)
d[i]=c[j];
printf("CRC编码结果为:\n");
for(i=0;i<=g+3;i++)
printf("%d",d[i]);
printf("\n");
}
void checkCRC()
{int b[4],c[8],d[35],e[35];
char a[35],f[1];/*a字符串由用户输入需编辑的码字,b字符串表示生成多项式,由系统确定*/
int i,j,code=0,create=0,m,n,l,k,g;
printf("请输入字长小于35位的CRC码码字:");
gets(f);
gets(a);
printf("%s\n",a);
for(i=0;i<35;i++)
if(a[i]!='1'&&a[i]!='0')break;
g=i-1;
for(i=0;i<=g;i++)
{a[i]=a[i]-48;
}
for(i=g;i>=0;i--)
e[i]=a[i];
for(j=0;j<=g;j++)
printf("%d ",e[j]);
printf("\n");
b[0]=1;b[1]=1;b[2]=0;b[3]=1;
for(j=3;j>=0;j--)
printf("%d",b[j]);
printf("\n");
for(i=0;i<4;i++)
{e[i]=e[i]*pow(2,3-i);
printf("%d ",e[i]);
}
printf("\n");
for(i=0;i<4;i++)
code=code+e[i];
printf("%d\n",code);
for(j=0;j<4;j++)
{b[j]=b[j]*pow(2,j);
}
for(j=3;j>=0;j--)
printf("%d ",b[j]);
printf("\n");
for(j=0;j<4;j++)
create=create+b[j];
printf("%d\n",create);
m=3;
do
{n=code^create;
printf("%d\n",n);
for(j=0;j<4;j++)
c[j]=0;
for(j=0;n!=0;)
{c[j]=n%2;
printf("%d ",c[j]);
n=n/2;
j++;
}
printf("\n");
j=3;
while(c[j]==0)
j--;
if(j==3)
{code=0;
for(j;j>=0;j--)
c[j]=c[j]*pow(2,j);
for(j=3;j>=0;j--)
code=code+c[j];
printf("code1=%d\n",code);
}
else
{
i=j;n=3-j;k=m;
code=0;
if(m+n<=g)
{for(i;i>=0;i--)
c[i]=c[i]*pow(2,i+n);
for(j;j>=0;j--)
code=code+c[j];
printf("code2=%d\n",code);
for(j=m+n,l=n-1;j>m;j--,l--)
e[j]=e[j]*pow(2,n-1-l);
for(j=m+n;j>m;j--)
code=code+e[j];
printf("code3=%d\n",code);
}
else
{for(i;i>=0;i--,k--)
c[i]=c[i]*pow(2,g-k);
for(j;j>=0;j--)
code=code+c[j];
for(j=g,l=n-1;j>m;j--,l--)
{e[j]=e[j]*pow(2,n-1-l);
printf("%d ",e[j]);}
printf("\n");
for(j=g;j>m;j--)
code=code+e[j];
printf("code4=%d\n",code);
}
m=m+n;
}
}while(m<=g);
if(code==0)printf("传输正确,可继续!\n");
else printf("传输有误!暂停传输!\n");
}
void main()
{int i,j;
do{
printf("******主菜单******\n");
printf("1.产生CRC编码\n");
printf("2.CRC码的检错\n");
printf("请选择:");
scanf("%d",&i);
switch(i){
case 1:createCRC();break;
case 2:checkCRC();break;
}
printf("按任意键继续,按0键推出系统\n");
scanf("%d",&j);
}
while(j!=0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -