python的crc-16校验

import struct
import logging


def calc_crc16(string):
    data = bytearray.fromhex(string)
    logging.info(type(data))
    crc = 0xFFFF
    for pos in data:
        crc ^= pos
        for i in range(8):
            if (crc & 1) != 0:
                crc >>= 1
                crc ^= 0xA001
            else:
                crc >>= 1

    return ((crc & 0xff) << 8) + (crc >> 8)


data_hex_str = "A55AD0001A0069643A553030310A46315F4765735F526573756C743A47303031"
value = calc_crc16(data_hex_str)
crc_bytes = struct.pack('<H', value)
print(crc_bytes)

### 3.5 自定义 CRC-16 校验算法的 Python 实现 在实际应用中,不同协议可能采用不同的 CRC-16 多项式和初始参数。为实现自定义 CRC-16 校验算法,需根据给定的多项式、初始值、输入输出反转方式等参数进行配置。 以下是一个通用的 CRC-16 实现方法,支持指定生成多项式(如 0xA001,即 0x8005 的位反转形式)、初始值(如 0xFFFF)等参数[^1]: ```python def calculate_crc16(data: bytes, poly: int = 0xA001, init_crc: int = 0xFFFF) -> int: crc = init_crc for byte in data: crc ^= byte for _ in range(8): if crc & 0x0001: crc = (crc >> 1) ^ poly else: crc >>= 1 return crc ``` 此函数可依据不同协议配置 CRC-16 算法,例如: - **CRC-16/MODBUS**:`poly=0xA001`, `init_crc=0xFFFF`[^1] - **CRC-16/CCITT-FALSE**:`poly=0x1021`, `init_crc=0xFFFF` 示例使用: ```python test_data = b"123456" crc16_modbus = calculate_crc16(test_data, 0xA001, 0xFFFF) print(f'CRC-16/MODBUS: 0x{crc16_modbus:04X}') ``` 该方法通过逐字节处理数据,并对每一位进行判断和移位操作,确保与硬件实现一致。在通信协议开发、嵌入式系统调试等场景中具有广泛适用性[^3]。 --- ### 3.6 查表法优化 CRC-16 计算性能 为了提高 CRC-16 的计算效率,可采用查表法预先生成 256 项的 CRC 表,然后通过查表加速计算过程。以下是一个基于预计算表的 CRC-16 实现示例: ```python # 生成 CRC-16 查表 def generate_crc16_table(poly: int = 0xA001) -> list: table = [0] * 256 for i in range(256): crc = i for _ in range(8): if crc & 0x0001: crc = (crc >> 1) ^ poly else: crc >>= 1 table[i] = crc return table # 使用查表法计算 CRC-16 def calculate_crc16_table(data: bytes, table: list, init_crc: int = 0xFFFF) -> int: crc = init_crc for byte in data: crc = table[(crc ^ byte) & 0xFF] ^ (crc >> 8) return crc ``` 使用示例: ```python crc_table = generate_crc16_table(0xA001) test_data = b"123456" crc16_value = calculate_crc16_table(test_data, crc_table, 0xFFFF) print(f'CRC-16 (查表法): 0x{crc16_value:04X}') ``` 该方法通过预先计算每个字节的 CRC 值,减少了重复的位运算操作,显著提升了计算速度,适用于需要频繁进行 CRC 校验的场景[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值