CRC16算法实现--移位法
这个代码是我在实际产品上应用的程序,前面那部分注释讲得是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; }
凯特网版权声明:以上内容允许转载,但请注明出处,谢谢!