能帮我写一个计算CRC16位的函数吗
时间: 2024-10-23 15:19:23 浏览: 9
C++ 通信常用转换函数汇总
当然可以,CRC(循环冗余校验)是一种常见的数据完整性检验算法,CRC16通常用于较短的数据包校验。以下是一个简单的Python函数,使用了ZigZag序列表示法来简化计算过程:
```python
def crc16(data, polynomial=0x8408): # 使用常用的16位CRC标准polynomial
POLYNOMIAL = polynomial
XOROUT = 0xFFFF
def _update_crc(crc, byte):
poly = POLYNOMIAL ^ (crc >> 8)
for _ in range(8):
if (poly & 0x8000) != 0:
crc ^= XOROUT
poly <<= 1
if poly & 0x10000:
poly ^= POLYNOMIAL
return crc & 0xFFFF
initial_crc = 0xFFFF
crc = _update_crc(initial_crc, data[0])
for byte in data[1:]:
crc = _update_crc(crc, byte)
return ~crc & 0xFFFF # Python中取反操作需要加~前缀
# 使用例子
data = b"Hello, World!"
computed_crc = crc16(data)
print(f"CRC16 of '{data.hex()}' is {computed_crc:04X}")
```
这个函数接受一个字节串`data`作为输入,并返回其对应的CRC16值。请注意,实际应用中可能需要使用特定库(如pycrc、bitarray等)来进行更高效和准确的计算。
阅读全文