嗨,我一直在尝试为要为其编写软件接口的设备计算 CRC。为简单起见,我会说 X 是设备,Y 是硬件控制器。我正在寻找正确方向的推动力我确信我在正确的轨道上只是在几点上有点困惑。
当设备空闲时,它每 2 秒左右发送以下数据字符串,看起来它正在以十六进制计数:两者之间的 2 个字节| |
是我假设的 CRC。(XX) 是可变字节。
X: 96 10 01 E1 (E4) 01 FF 10 17 | F7 EC | 10 06 E1 96 FE X: 96 10 01 E1 (E6) 01 FF 10 17 | 7F FA | 10 06 E1 96 FE X: 96 10 01 E1 (E8) 01 FF 10 17 | C7 9B | 10 06 E1 96 FE X: 96 10 01 E1 (EA) 01 FF 10 17 | 4F 8D | FE 10 06 E1 96 FE X: 96 10 01 E1 (EC) 01 FF 10 17 | D7 B6 | FE 10 06 E1 96 FE X: 96 10 01 E1 (EE) 01 FF 10 17 | 5F A0 | FE 10 06 E1 96 FE
使用reveng
withreveng -w 16 -s
和上述数据集我得到:
宽度=16 多边形=0x1021 初始化=0x1e69 优化=真 refout=真 xorout=0x0000 检查=0x3da6 名称=(无)
当我拦截来自控制器的 a 命令时,我得到:
X: 96 10 01 E1 (EE) 01 FF 10 17 | 5F A0 | FE 10 06 E1 96 FE -- 命令前的最后一行 Y: E1 10 01 96 (22) 05 01 C0 A8 35 00 10 17 |0B B8| FE 10 06 96 E1 FE
其中 (22) 是修饰符|0B B8|
是 CRC。22是怎么从E4衍生出来的?是另一个 CRC 吗?
当我多次发送相同的命令时,我截获了以下内容:
Y: E1100196220501C0A8350010170BB8FE100696E1FE Y: E11001962A0501C0A835001017C1C7FE100696E1FE Y: E11001962E0501C0909400101753C8FE100696E1FE Y: E1100196300501809094001017C3EEFE100696E1FE Y: E1100196360501C090940010170D48FE100696E1FE Y: E11001962A0501C09094001017B6F7FE100696E1FE Y: E11001962A0501C09094001017B6F7FE100696E1FE
使用reveng
withreveng -w 16 -s
和上述数据集我得到:
宽度=16 多边形=0x1021 初始化=0xd313 优化=真 refout=真 xorout=0x0000 检查=0x295f 名称=(无)
多项式是相同的,但 init 和 check 不同,很抱歉,很长的帖子,但这里是我的问题的摘要:
1)说设备使用相同的多项式但不同的init并检查控制器是否常见?
2) 来自设备的常量计数字符串是否用于偏移用于计算校验和的变量字节?如果是这样,这种机制称为什么,可以使用哪些方法来得出计数和字节之间的关系?
3)我是在正确的轨道上还是在途中迷路了?
感谢您花时间阅读本文,非常感谢您朝着正确的方向前进。