2016-04-29 114 views
3

我见过两种不同的CRC算法。一种称为“直接”,另一种称为“非直接”或“间接”。两者的代码有点不同。如果直接类型以转换的初始值提供,两者都能够计算相同的校验和。直接和间接CRC之间的区别

我可以成功运行这两种算法,我知道如何转换初始值。所以这是没有问题的。

我无法找到:为什么这两种算法存在?有人能做别人不能做的事吗?从用户的角度来看,它们是多余的吗?

UPDATE你可以找到一个可测试的在线实现(和两个aglorithms的C实现)here。然而,这些术语(或其中之一)在更多地方被提及。像here(“直接表算法”),微控制器参考文献中,在等论坛

+1

请提供您参考的“直接”和“间接”算法的参考。我已经实施了很多CRC,但我还没有看到过这些术语。 –

+0

请参阅我的更新。我不确定这些术语是否含糊不清,但很多时候作者都提到初始值需要转换这一事实,因此这似乎与CRC算法的一个共同特征有关。 – Silicomancer

回答

1

“直接”指的是如何避免处理Ñ零位在端部用于Ñ位CRC。

CRC的数学定义是消息的一个分割,n零位附加到它。在操作之前,您可以通过排除具有CRC的消息来避免额外的操作,而不是之后。这需要通过CRC处理正常版本中的寄存器的初始值,并将其作为新的初始值。

由于没有必要,您将永远看不到执行额外操作的真实世界的CRC算法。

请参阅您链接的文档中的“10.稍微纠缠的表驱动实现”一节以获取更详细的解释。

+0

如果直接真实世界的算法不会像原来那样转换初始值,会发生什么情况?我认为它会计算一个不同的(不正确的)校验和,但只要同一个错误一致地完成,它就会工作(相同的汉明距离)...我是否正确? – Silicomancer

+1

是的。结果只是一个常数或者一个常数。 –