CRC的过程

https://blog.csdn.net/cyydps/article/details/44065827

循环冗余校验 (CRC) 域为两个字节, 包含一个二进制 16 位值。 附加在报文后面的 CRC 的值由发送设备计算。 接收设备在接收报文时重新计算 CRC 的值,并将计算结果于实际接收到的 CRC值相比较。 如果两个值不相等, 则为错误。
生成 CRC 的过程为:
1.将一个16位的变量赋值为0xffff,这个变量称为crc寄存器。
2.将报文的第一字节与crc寄存器相异或保存到crc寄存器中。
3.将crc寄存器右移一位,高位补零。
4.判断被移掉的那一位是0还是1,如果是0,则回到3步骤;如果是1,则crc寄存器与0xa001进行异或保存到crc寄存器中。
5.重复3-4直到完成八次移位。
6.对下一个字节重复2-5步骤。
7.对报文每个字节进行计算后,就生成了crc了,不过需要注意的是:放置到crc到报文中去的时候高低字节需要交换位置。
我们发现放置的crc报文是采用大端的方式放置在报文中,如果你的系统主机字节序是大端(big-endian)那么就不需要交换位置。
普遍来讲我们使用的主机字节序都是小端的(little-endian),下面我给出的也是基于小端字节序的代码。
u16 crc16(u8 *buf,u8 len)

{    

u16 crc = 0xffff;  

 u8 crc_temp;    

int i = 0;    

while(len--)  

   {        

    crc ^= *buf;        

    for(i = 0;i<8;i++)        

                            {            

                             if(crc&0x0001)                

                             crc = (crc>>1)^0xa001;            

                             else              

                             crc = crc>>1;      

                             }    

      }    

crc_temp = crc<<8;    

return (crc>>8 | crc_temp);

}

--------------------- 
作者:cyydps 
来源:CSDN 
原文:https://blog.csdn.net/cyydps/article/details/44065827 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值