算法描述
- 预置一个16位寄存器为0xFFFFH(全1),称之为CRC寄存器。
- 把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。
- 将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。
- 如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。
- 重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。
- 重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。
- 最终CRC寄存器的值就是CRC的值。
代码实现
private void GetCRC(byte[] arr)
{
ushort CRCReg = 0xFFFF;//定义crc寄存器
for (int i = 0; i < arr.Length - 2; i++)
{
CRCReg ^= arr[i];
for (int j = 0; j < 8; j++)
{
if ((CRCReg & 1) == 0)
{
CRCReg >>= 1;
}
else
{
CRCReg >>= 1;
CRCReg ^= 0xA001;
}
}
}
arr[arr.Length - 2] = (byte)(CRCReg & 0x00FF);//低字节在前
arr[arr.Length - 1] = (byte)(CRCReg >> 8);//高字节在后
}
//异或运算规则:
//0^0=0,
//1^1=0,
//0^1=1
//1^0=1