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;
}
凯特网版权声明:以上内容允许转载,但请注明出处,谢谢!
