寰寰闲话:
相关原理解释csdn里面贼多,好多博主讲的贼棒,所以我就单纯就课程设计来说一说,所实现的功能分两部分就是得到CRC校验码的发送比特序列以及校验过程。所以在写的时候当成两个函数就好啦。话不多说,直接撸代码!
代码如下
#include <stdio.h>
#include <math.h>
int count(int);
void sc();//生成函数
bool jy();//校验函数
int main()
{
printf("请输入你的选择:\n1--生成CRC校验码\n2--校验对错\n");
int choose = 0;
scanf("%d",&choose);
switch (choose)
{
case 1:
sc();
break;
case 2:
if(jy())
{
printf("传输过程正确\n");
}
else
{
printf("传输过程错误\n");
}
break;
default:
break;
}
return 0;
}
int count(int num)//计算位数
{
unsigned int a, b = 0; /*计算生成码的长度m*/
a = num;
do
{
a >>= 1;//每移一位,位数加1,直到最高位为0
b++;
} while (a != 0);
return b;
}
void sc()
{
unsigned int gx, fx, m, n, z;
printf("以下数据以十六进制计数方式输入\n");
printf("请输入生成码的值:\n");
scanf("%x", &gx);
printf("请输入信息码的值:\n");
scanf("%x", &fx);
m = count(gx);//gx的位数
n = count(fx);//fx位数
fx <<= m - 1; /*信息码左移m-1位,求出扩展列,即fx*(gx的最高次幂的位数)*/
unsigned int ffx;//拷贝一个fx
ffx = fx;
for (int i = m + n - 1; i >= m; i--)
{
if ((ffx >> (i - 1)) == 0)//相与直到为0
continue;
unsigned int tmp = 0xffffffff;//32位
tmp <<= (32 - i);
tmp >>= (32 - i); //高位清0
ffx &= tmp; //保留ffx的低位
ffx ^= (gx << (i - m));//减去是gx的位数
}
ffx &= (0xffffffff << 32 - (m - 1)) >> (32 - (m - 1)); //高位清0
z = ffx | fx;
printf("输出CRC校验码比特序列R(x)=0x%x", ffx);
printf("\n");
printf("输出带CRC校验码的发送数据比特序列为0x%x\n", z);
}
bool jy()
{
unsigned int gx, fx, m, n, z;
printf("以下数据以十六进制计数方式输入\n");
printf("请输入生成码的值:\n");
scanf("%x", &gx);
printf("请输入待校验数据:\n");
scanf("%x", &fx);
m = count(gx);
n = count(fx);
unsigned int ffx;
ffx = fx;
for (int i = n; i >= m; i--)
{
if ((ffx >> (i - 1)) == 0)
continue;
unsigned int tmp = 0xffffffff;
tmp <<= (32 - i);
tmp >>= (32 - i); //高位清0
ffx &= tmp; //保留ffx的低位
ffx ^= (gx << (i - m));
}
if(ffx == 0)
{
return true;
}
else
{
return false;
}
}
解释说明:想实现循环输入,在main函数里加个while(1)就好啦。校验函数里面的fx代表的意思就是待校验的CRC码,因为整个算法主要就是多项式除的过程,这里运用移位来进行模拟除的过程,就是这个算法,两个相除。
for (int i = m + n - 1; i >= m; i--)
{
if ((ffx >> (i - 1)) == 0)//相与直到为0
continue;
unsigned int tmp = 0xffffffff;//32位
tmp <<= (32 - i);
tmp >>= (32 - i); //高位清0
ffx &= tmp; //保留ffx的低位
ffx ^= (gx << (i - m));//减去是gx的位数
}
有需要的同学可以参考这个过程,进而写出符合要求的课程设计!有什么问题可以评论留言,再给大家解答,也可以关注一哈我?!