crc - 我如何为这个协议建模 CRC
问题描述
我有一个 TWI 设备的协议规格表,其中指出:
CRC 字节是使用初始种子 0x5A 和多项式 XOR 值 0x18 的八位循环冗余校验。
该规范提供了一些示例命令:
稍后还有一个附加示例,其中 CRC 0x07 由命令 0x15 产生
它还指出
数据以最高有效位在前按位顺序发送。
我尝试为使用http://www.sunshine2k.de/coding/javascript/crc/crc_js.html给出的命令示例计算 CRC 值
使用反射和非反射输入和结果,但我无法得到计算的 CRC 以匹配命令示例。
我错过了一些明显的东西吗?
解决方案
反映了CRC,多项式为x 8 +x 5 +x 4 +1。以下降的高功率反映的多项式是0x8c
。此 C 代码计算 CRC:
unsigned crc8twi(unsigned char const *data, size_t len) {
unsigned crc = 0x5a;
for (size_t i = 0; i < len; i++) {
crc ^= data[i];
for (int k = 0; k < 8; k++)
crc = crc & 1 ? (crc >> 1) ^ 0x8c : crc >> 1;
}
return crc;
}
这给出了、06
for 、for 、for和for的CRC 。0c
48
0c f0 64 b8 13
5a
11 03
a5
00
07
15
我不知道如何48
在第二个示例中获得,但我也不知道向上和向下箭头是什么意思,也不知道蓝色和粉红色是什么意思。
我也不知道“0x18 的多项式 XOR 值”是什么意思。正确多项式的 Koopman 表示将0x98
,接近但不相同。
更新:
好的,这0x18
来自一个真正曲折的 CRC 计算方法,如下面的 OP 评论中的链接所示:
在那个例子中,多项式的应用发生在两个不同的地方。是0x18
多项式向下移动了一位,尽管由于代码一次一位地通过数据位而没有反映出来。
这实际上在我不久前的另一个答案中注意到了(我忘记了)。
推荐阅读
- javascript - 如何返回嵌套数组中的唯一项
- css - 使用 Emotion css 将图像添加到按钮
- javascript - 我不明白为什么气球在我制作的小游戏中没有移动
- javascript - 简单的javascript函数返回一个未定义的字符串
- c++ - std::bind 是否实现了 std::ref 和 std::cref 以消除函数调用的歧义?
- python - AZure DataBricks - 大型 CSV 文件字段验证
- javascript - 使用 DataTables ajax 响应中的变量来填充 yadcf 过滤器
- c# - 使用 AsyncContext 遇到死锁代码
- php - 使用 php 或其他语言使部分 url 消失
- python - 如何为多项逻辑回归构建此数据集