我试图用 CRC 生成器 100101 实现 5 位 CRC。但是,此代码没有反映 CRC 中的硬件 Xor 和移位寄存器;在硬件层面,我们有以下内容:
这如何在 python 上实现?
作为澄清,我想知道是否有一些代码可以处理按位异或和移位运算符 << 作为解决此问题的方法
我不确定你在问什么——到目前为止,你的代码看起来还不错,而且正如你所说,它给出了正确的结果。
我可能会指出标准库中的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
编辑:
由于您要求算法的按位实现,您可能需要检查这些来源:
如果您想真正使用 CRC 代码(而不是研究它们的实现),您可能会发现Python crcmod模块非常有用。我已经使用它多年了,它非常易于使用。只需输入多项式并准备好一个 CRC 函数来处理您的数据。
然而,它可能不支持 5 位 CRC 多项式。
然而,这段代码并没有反映 CRC 中的硬件异或和移位寄存器;
确实如此!
这个:
CRC[0] = CRC[1]
CRC[1] = CRC[2]
CRC[2] = CRC[3]
CRC[3] = CRC[4]
CRC[4] = input
是移位寄存器的模型。
这(Something+1) %2
是表示 XOR 操作的一种方式。
我认为您已经非常准确地建模了您展示的图表!