我正在尝试将 CRC16 错误检测添加到 Motorola HCS08 微控制器应用程序。但我的校验和不匹配。一在线CRC计算器提供了我在 PC 程序中看到的结果和我在微型计算机上看到的结果。
它将微处理器的结果称为“XModem”,将 PC 的结果称为“Kermit”。
这两个古老协议指定 CRC16 的使用方式有什么区别?
您可以使用相同的基本代码库实现 16 位 IBM、CCITT、XModem、Kermit 和 CCITT 1D0F。看http://www.acooke.org/cute/16bitCRCAl0.html它使用的代码来自http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code
下表显示了它们的不同之处:
name polynomial initial val reverse byte? reverse result? swap result?
CCITT 1021 ffff no no no
XModem 1021 0000 no no no
Kermit 1021 0000 yes yes yes
CCITT 1D0F 1021 1d0f no no no
IBM 8005 0000 yes yes no
其中“反转字节”表示每个字节在处理之前进行位反转; ‘reverse result’表示将16位结果处理后进行位反转; ‘swap result’表示处理后结果中的两个字节被交换。
以上所有内容都通过测试向量进行了验证http://www.lammertbies.nl/comm/info/crc-calculation.html(如果这是错误的,我们都迷路了......)。
因此,在您的特定情况下,您可以通过对每个字节进行位反转、对最终结果进行位反转,然后交换结果中的两个字节,将 XModem 的代码转换为 Kermit。
[我相信,但尚未检查或计算出细节,反转每个字节相当于反转多项式(加上一些额外的细节)。这就是为什么您会在不同的地方看到对于基本相同的算法有截然不同的解释。
另外,上述方法效率不高,但适合测试。如果你想要高效,最好的办法是将上面的内容转换为查找表。]
edit我上面所说的 CCITT 记录在RevEng目录作为 CCITT-FALSE。有关更多信息,请参阅上面链接中我的博客文章的更新。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)