模拟实现CRC校验算法课程设计代码(C语言)
寰寰闲话:
相关原理解释csdn里面贼多,好多博主讲的贼棒,所以我就单纯就课程设计来说一说,所实现的功能分两部分就是得到CRC校验码的发送比特序列以及校验过程。所以在写的时候当成两个函数就好啦。话不多说,直接撸代码!
代码如下
#include
#include 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));
//高位清0z = 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的位数
}
【模拟实现CRC校验算法课程设计代码(C语言)】有需要的同学可以参考这个过程,进而写出符合要求的课程设计!有什么问题可以评论留言,再给大家解答,也可以关注一哈我?!
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- java中如何实现重建二叉树
- 人脸识别|【人脸识别系列】| 实现自动化妆
- paddle|动手从头实现LSTM
- pytorch|使用pytorch从头实现多层LSTM