三种CRC16 C语言算法

本文详细介绍了三种不同的CRC16校验算法在C语言中的实现方式,包括基本原理、代码示例和应用场景,帮助读者理解CRC16在数据通信中的重要作用。
摘要由CSDN通过智能技术生成
/**
  * @brief 按半字计算CRC,按半字计算运算量比按字节计算大约1倍,表占用空间只有1/16。
        由于按字节计算需要存在256个16位数据,所以需要512个字节的空间,对于部分系统存在空间不足的情况,
        因此出现了按半字节计算的方式,由于半字节只能表示0 - 15,所以只需16个16位的数据,32个字节空间
  * @param  data: 数组
  * @param  len:  数组长度
  * @retval None.
  */
const my_u16_t g_u16_first_crc_table[16] = {
   
    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
    0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef};

my_u16_t My_firstCRC16(my_u8_t *data, my_u16_t len)
{
   
    my_u16_t crc16 = 0x0000;
    my_u16_t crc_h4, crc_l12;
    while (len--)
    {
   
        crc_h4 = (crc16 >> 12);
        crc_l12 = (crc16 << 4);
        crc16 = crc_l12 ^ g_u16_first_crc_table[crc_h4 ^ (*data >> 4)];
        crc_h4 = (crc16 >> 12);
        crc_l12 = (crc16 << 4);
        crc16 = crc_l12 ^ g_u16_first_crc_table[crc_h4 ^ (*data & 0x0f)];
        data++;
    }
    return crc16;
}

/**
  * @brief  按位计算CRC,按位计算运算量比较大,占用空间小。
  *  首先CRC算法即为一个序列与多项式(CCITT:0x11021)进行模2除法,然后按位计算CRC可以理解为首先将第一个位
  * 与多项式进行模二除法,得到一个余数,再将余数右移一位加上(不进位加法)第二个位再与多项式进行模二除法,
  * 直到计算到最后一位
  * @param  data: 数组
  * @param  len:  数组长度
  * @retval None.
  */
my_u16_t My_scecondCRC16(my_u8_t *data, my_u16_t len)
{
   
    my_u16_t crc16 = 0x0000;
    while (len--)
    {
   
        for (my_u8_t i = 0x80; i != 0; i >>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值