当前日期:2021年12月03日 星期五
Hi 你好,欢迎访问!登录
搜索 导航

凯特网-Think and Do it , as Soon as!

当前位置:首页 - 程序设计 - 正文
阅读模式

CRC16算法实现--移位法

2015-06-06 | 程序设计 | caterwang | 1972°c

 这个代码是我在实际产品上应用的程序,前面那部分注释讲得是CRC16校验码生成的算法,其他部分看注解应该是比较清楚了!

//=================================CRC16发生器=================================

/*

1.置16位寄存器为全1,作为CRC寄存器。

2.把一个8位数据与16位CRC寄存器的低字节相异或,把结果放于CRC寄存器中。

3.把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位(移出位)。

4.如果最低位为0,重复③(再移位);如果最低位为1,CRC寄存器与多项式A001H(1010 0000 0000 0001)进行异或。

5.重复③、④,直到右移8次,这样整个8位数据全部进行了处理。

6.重复②-⑤,进行下一个8位数据的处理。

7.将一帧的所有数据字节处理完后得到CRC-16寄存器。

8.将CRC-16寄存器的低字节和高字节交换,得到的值即为CRC-16码。

*/

//输入:CRCArray表示要对这个数组序列进行CRC16验验,nCount则表示要对这个数组序列的前nCount个成员进行CRC16校验

void CRCParity(unsigned char *CRCArray,char nCount)

{

   union CRC{

           unsigned short CRCWord;

           struct {

                   unsigned char  Hi;

                   unsigned char  Lo;

                   } CRCByte;

           }CRC16;

   unsigned char i,j;

   CRC16.CRCWord=0xffff;

   for (j=0;j<nCount;j++)

     {

       CRC16.CRCByte.Lo^=CRCArray[j];

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

        {

         if (CRC16.CRCWord & 0x0001)

            {

              CRC16.CRCWord =CRC16.CRCWord >>1;

              CRC16.CRCWord =CRC16.CRCWord ^ 0xA001;

            }

         else

              CRC16.CRCWord =CRC16.CRCWord >>1;

         }

     }

CRC16H=CRC16.CRCByte.Hi;

CRC16L=CRC16.CRCByte.Lo;

}

请使用支付宝赞助我

支付宝打赏

请使用微信赞助我

微信打赏

版权声明

欢迎转载,但注明出处,谢谢!

分享:
0
QR:  CRC16算法实现--移位法

扫一扫,用手机打开吧

共0条评论

暂时没有评论,你可以来抢个沙发!

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

展开