Python CRC16 校验码计算:高低字节交换优化
Python CRC16 校验码计算:高低字节交换优化
本文将介绍如何使用 Python 实现 CRC16 校验码计算,并通过代码优化,在所有字节计算完成后,将 16 位 CRC 寄存器的高、低字节进行交换,最终将校验码以十六进制格式输出。
原始代码:
def crc16(data):
if isinstance(data, str):
data = data.encode('ascii')
crc = 0xFFFF # 初始值
poly = 0x1021 # 多项式
for i in range(len(data)):
crc ^= (data[i] << 8) # 异或操作
for j in range(8):
if crc & 0x8000: # 判断最高位是否为1
crc = (crc << 1) ^ poly # 如果最高位为1,则左移1位并异或多项式
else:
crc <<= 1 # 如果最高位为0,则左移1位
return crc # 返回低16位校验码
if __name__ == "__main__":
data = '6001'
crc = crc16(data)
print(hex(crc)) # 将十进制校验码转为十六进制输出
优化后的代码:
def crc16(data):
if isinstance(data, str):
data = data.encode('ascii')
crc = 0xFFFF # 初始值
poly = 0x1021 # 多项式
for i in range(len(data)):
crc ^= (data[i] << 8) # 异或操作
for j in range(8):
if crc & 0x8000: # 判断最高位是否为1
crc = (crc << 1) ^ poly # 如果最高位为1,则左移1位并异或多项式
else:
crc <<= 1 # 如果最高位为0,则左移1位
crc = ((crc << 8) & 0xFF00) | ((crc >> 8) & 0x00FF) # 交换高、低字节
return crc # 返回低16位校验码
if __name__ == "__main__":
data = '6001'
crc = crc16(data)
print(hex(crc)) # 将十进制校验码转为十六进制输出
在计算完 16 位 CRC 校验码后,我们通过移位和按位或运算的方法,将校验码的高、低字节进行了交换。最后输出结果时,依然将校验码转为十六进制格式输出。
代码解释:
crc = ((crc << 8) & 0xFF00) | ((crc >> 8) & 0x00FF):这行代码用于交换 CRC 校验码的高、低字节。(crc << 8):将 CRC 左移 8 位,将高字节移到低字节的位置。(crc >> 8):将 CRC 右移 8 位,将低字节移到高字节的位置。& 0xFF00:与 0xFF00 进行按位与运算,保留高字节,低字节置为 0。& 0x00FF:与 0x00FF 进行按位与运算,保留低字节,高字节置为 0。|:将两个结果进行按位或运算,将高、低字节交换。
总结:
通过对代码进行优化,我们在计算完 CRC 校验码后,对高低字节进行了交换,实现了更符合实际需求的校验码计算。
原文地址: https://www.cveoy.top/t/topic/lI3i 著作权归作者所有。请勿转载和采集!