crc基础相关内容可参考: https://blog.csdn.net/xiaoyuanwuhui/article/details/131259671
计算法
# 将32位数据逆序排列
def reverse32(x):
x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1))
x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2))
x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4))
x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8))
return (x >> 16) | (x << 16)
# 8位数据逆序排列
def reverse8(x):
x = (((x & 0xaa) >> 1) | ((x & 0x55) << 1))
x = (((x & 0xcc) >> 2) | ((x & 0x33) << 2))
return (x >> 4) | (x << 4)
# 方法一:通过标准顺序的方式求解CRC校验值
def crc32_1(data):
crc = 0xFFFFFFFF # 初始值
crc_polynomial = 0x04C11DB7 # 多项式值
for byte in data:
crc ^= (reverse8(byte) << 24) # 将输入数据逆序处理