目录
一、循环冗余校验(CRC)算法
循环冗余校验(CRC)算法是一种广泛应用于数据传输和存储中的错误检测方法。它通过利用多项式除法及余数的原理,对传输或存储的数据进行校验,以确保数据的完整性和准确性。CRC16是CRC算法中的一种常见标准,例如ANSI CRC16。CRC16 码由传输设备计算后加入到数据包中。接收设备重新计算接收数据包的CRC16码,并与接收到的CRC16码比较,如果两值不同,则有误,可据此判断数据在传输过程中是否出现错误。
CRC16校验字节的生成步骤如下:
1) CRC16 校验寄存器赋值为0xFFFF;
2) 取被校验串的第一个字节赋值给临时寄存器;
3) 临时寄存器与CRC16 校验寄存器的高位字节进行“异或”运算,赋值给CRC16 校验寄存器;
4) 取CRC16 校验寄存器最后一位赋值给检测寄存器;
5) 把CRC16 校验寄存器右移一位;
6) 若检测寄存器值为1,CRC16 校验寄存器与多项式0xA001 进行“异或”运算,赋值给CRC16
校验寄存器;
7) 重复步骤4~6,直至移出8 位;
8) 取被校验串的下一个字节赋值给临时寄存器;
9) 重复步骤3~8,直至被校验串的所有字节均被校验;
10) 返回CRC16 校验寄存器的值。
校验码按照先高字节后低字节的顺序存放。
二、代码实现
def cyclic_redundancy_check(data):
crc = 0xFFFF
for byte in data:
crc = (crc >> 8) ^ byte
for _ in range(8):
if crc & 1 == 1:
crc = (crc >> 1) ^ 0xA001
else:
crc >>= 1
return '{:04X}'.format(crc)
data = "QN=20240228125418352;ST=91;CN=9014;PW=123456;MN=KSHQTR20200004;Flag=4;CP=&&&&"
print(cyclic_redundancy_check(data.encode('utf-8')))
#计算结果:5440
三、总结
之所以用到ANSI CRC16校验算法,主要是用于对物联设备的传感数据进行可靠性验证,提高数据传输的可靠性和准确性。