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 校验码后,我们通过移位和按位或运算的方法,将校验码的高、低字节进行了交换。最后输出结果时,依然将校验码转为十六进制格式输出。

代码解释:

  1. crc = ((crc << 8) & 0xFF00) | ((crc >> 8) & 0x00FF):这行代码用于交换 CRC 校验码的高、低字节。
    • (crc << 8):将 CRC 左移 8 位,将高字节移到低字节的位置。
    • (crc >> 8):将 CRC 右移 8 位,将低字节移到高字节的位置。
    • & 0xFF00:与 0xFF00 进行按位与运算,保留高字节,低字节置为 0。
    • & 0x00FF:与 0x00FF 进行按位与运算,保留低字节,高字节置为 0。
    • |:将两个结果进行按位或运算,将高、低字节交换。

总结:

通过对代码进行优化,我们在计算完 CRC 校验码后,对高低字节进行了交换,实现了更符合实际需求的校验码计算。

Python CRC16 校验码计算:高低字节交换优化

原文地址: https://www.cveoy.top/t/topic/lI3i 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录