Python: 使用异或和移位寄存器实现CRC
我在尝试用CRC生成器100101来实现5位CRC。不过,这段代码没有反映出CRC中的硬件异或和移位寄存器;在硬件层面,我们有如下结构:
那么,这个在Python中该怎么实现呢?
为了更清楚,我想知道有没有一些代码可以处理按位异或和移位操作符<<,作为解决这个问题的一种方法。
3 个回答
0
不过,这段代码并没有反映出CRC中的硬件异或和移位寄存器。
其实是有的!
这段代码:
CRC[0] = CRC[1]
CRC[1] = CRC[2]
CRC[2] = CRC[3]
CRC[3] = CRC[4]
CRC[4] = input
就是一个移位寄存器的模型。
这里的(Something+1) %2
是表示异或操作的一种方式。
我认为你已经很准确地模拟了你展示的图示!
1
如果你想真正使用CRC代码(而不是单纯研究它们的实现),那么你可能会觉得Python的crcmod模块非常有用。我已经使用它很多年了,使用起来非常简单。只需要输入多项式,就能得到一个可以处理你数据的CRC函数。
不过,它可能不支持5位的CRC多项式。
3
我不太明白你在问什么——你的代码看起来没问题,而且正如你所说,它给出的结果也是正确的。
我可以推荐你看看标准库中的 collections.deque 数据结构。我觉得它在表示移位寄存器时非常有用,因为它提供了 rotate()
方法,可以实现这种循环移位。
这段代码给出的结果和你的代码是一样的:
from collections import deque
deque_crc = deque([0,0,0,0,0],maxlen=5)
myID.extend(deque_crc)
for x in myID:
deque_crc.rotate(-1)
deque_crc[2] = (deque_crc[2] + deque_crc[4]) % 2
deque_crc[4] = (deque_crc[4] + x) % 2
myID[-5:] = deque_crc
print myID
编辑:
既然你在寻找算法的位运算实现,你可以查看这些资源: