为什么函数里能分字节计算CRC?以下是一些观察和推演。
02 85 CRC是73C1
02是813E 翻转是 7C81
如果 数据85按初始值为7C81 计算CRC 结果也是73C1 这就很神奇了
推演一下:
02 85 0000 0010 1000 0101 翻转 0100 0000 1010 0001
补零并异或FFFF 求余数
1 1000 0000 0000 0101【1011 1111 0101 1110 0000 0000 0000 0000
0111 1111 0101 1100 10
001 1111 0101 1101 1100
0 0111 0101 1101 1001 00
001 0101 1101 1000 0100
0 1101 1101 1000 0001 0
(后面发现:1101 1101 1000 0001与分别计算时 第二字节的被除数一样)
0001 1101 1000 0011 1000
0 0101 1000 0011 1101 00
011 1000 0011 1100 010
00 1000 0011 1100 1110
余数 1000 0011 1100 1110
CRC:73C1
85 1000 0101 翻转 1010 0001 补零 1010 0001 0000 0000 0000 0000
前16位 异或 0x7C81 0111 1100 1000 0001
1101 1101 1000 0001 0000 0000 模二除以1000 0000 0000 0101
1 1000 0000 0000 0101【1101 1101 1000 0001 0000 0000
0001 1101 1000 0011 1000
0 0101 1000 0011 1101 00
011 1000 0011 1100 010
00 1000 0011 1100 1110
余数1000 0011 1100 1110
CRC:73C1
结果相等 为什么?
再计算 02的CRC 观察一下
1 1000 0000 0000 0101【1011 1111 1111 1111 0000 0000
0111 1111 1111 1101 10
001 1111 1111 1100 1100
0 0111 1111 1100 1001 00
001 1111 1100 1000 0100
0 0111 1100 1000 0001
余数:0111 1100 1000 0001 7C81
CRC:813E
单字节左移8位得出来的余数 和第二个字节异或 再左移8位 得出来的余数
等于 双字节 左移16位得出来的余数
说到底是 CRC这16位的变化
双字节左移8位后的余数 与 单字节第二字节前16位异或单字节余数得到的值是一样的哦
前8次移位 移位节奏和异或节奏都是一样 就是异或FFFF的次序不同 相当于先留着FF 等移位过去了再异或 最终结果是一样的
那函数里按字节分隔计算确实没问题。
3万+

被折叠的 条评论
为什么被折叠?



