直接和间接 CRC 之间的区别
Difference between direct and indirect CRC
我见过两种不同的CRC算法。一种称为"direct",另一种称为"non-direct"或"indirect"。两者的代码有点不同。如果为直接类型提供转换后的初始值,两者都能够计算出相同的校验和。
我可以成功 运行 这两种算法,我知道如何转换初始值。所以这没问题。
我没弄清楚的是:为什么这两种算法存在?有没有一个人可以做另一个人做不到的事情?从用户的角度来看,它们是多余的吗?
UPDATE 您可以在微控制器参考文档中找到可测试的在线实现(以及两种算法的 C 实现)here. However these terms (or one of them) are mentioned in some more places. Like here ("direct table algorithm"),在论坛等
"direct" 指的是如何避免在 n 位 CRC 的末尾处理 n 零位.
CRC 的数学定义是对消息进行分割,并在其后附加 n 个零位。您可以通过在对消息进行操作之前而不是之后对消息与 CRC 进行异或运算来避免额外的操作。这就需要将普通版寄存器的初值通过CRC校验处理,作为新的初值。
由于没有必要,您永远不会看到真实世界的 CRC 算法执行额外的操作。
请参阅您 link 文档中的“10. 一个略微损坏的 Table 驱动的实现”部分以获得更详细的解释。
我见过两种不同的CRC算法。一种称为"direct",另一种称为"non-direct"或"indirect"。两者的代码有点不同。如果为直接类型提供转换后的初始值,两者都能够计算出相同的校验和。
我可以成功 运行 这两种算法,我知道如何转换初始值。所以这没问题。
我没弄清楚的是:为什么这两种算法存在?有没有一个人可以做另一个人做不到的事情?从用户的角度来看,它们是多余的吗?
UPDATE 您可以在微控制器参考文档中找到可测试的在线实现(以及两种算法的 C 实现)here. However these terms (or one of them) are mentioned in some more places. Like here ("direct table algorithm"),在论坛等
"direct" 指的是如何避免在 n 位 CRC 的末尾处理 n 零位.
CRC 的数学定义是对消息进行分割,并在其后附加 n 个零位。您可以通过在对消息进行操作之前而不是之后对消息与 CRC 进行异或运算来避免额外的操作。这就需要将普通版寄存器的初值通过CRC校验处理,作为新的初值。
由于没有必要,您永远不会看到真实世界的 CRC 算法执行额外的操作。
请参阅您 link 文档中的“10. 一个略微损坏的 Table 驱动的实现”部分以获得更详细的解释。