研究CRC的原理,看的有点懵,尝试用python实现,以下为试验与zlib的CRC32结果相同的代码段:
def crc32_zlib(data, poly=0xEDB88320, init=0xFFFFFFFF): #zlib.crc32 使用的是 反转多项式(reversed polynomial),即 0xEDB88320
"""
计算 CRC-32 校验值
:param data: 输入数据(字节列表)
:param poly: 多项式(默认是 CRC-32反转多项式 0xEDB88320)
:param init: 初始值(默认是 0xFFFFFFFF)
:return: CRC 校验值(32 位)
"""
crc = init
for byte in data:
crc ^= byte # 反转多项式数据不左移
for _ in range(8):
if crc & 1:
crc = (crc >> 1) ^ poly # 按顺序处理,不需要左移
else:
crc >>= 1
return crc ^ 0xFFFFFFFF
测试代码为:
# 输入数据
data = [0xF7, 0x9E, 0xEF, 0x7D, 0xEF, 0x7D, 0xEF, 0x5D, 0xEF, 0x5D, 0xE7, 0x5D, 0xE7, 0x3D, 0xE7, 0x3C]
# 计算 CRC 校验值
crc32_zlib_value = crc32_zlib(bytes(data))
print(f"自定义CRC-32 校验值: 0x{crc32_zlib_value:08X}")
CRC_num = zlib.crc32(bytes(data))
print(f"ZLIB CRC-32 校验值: 0x{CRC_num:08X}")