模拟实现CRC校验算法课程设计代码(C语言)

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值