首页 > 编程知识 正文

crc校验算法原理及实现,crc8校验算法c语言

时间:2023-05-03 13:00:53 阅读:187838 作者:3300

寰寰闲话:
相关原理解释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%xn", 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的位数 }

有需要的同学可以参考这个过程,进而写出符合要求的课程设计!有什么问题可以评论留言,再给大家解答,也可以关注一哈我?!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。