Python: 使用异或和移位寄存器实现CRC

1 投票
3 回答
2448 浏览
提问于 2025-04-17 17:53

我在尝试用CRC生成器100101来实现5位CRC。不过,这段代码没有反映出CRC中的硬件异或和移位寄存器;在硬件层面,我们有如下结构:

enter image description here

那么,这个在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

编辑:

既然你在寻找算法的位运算实现,你可以查看这些资源:

撰写回答