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 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(CRC的过程)