硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1049|回复: 4
收起左侧

[其它] CRC16(Modbus多项式)怎么增量更新CRC,只改了1个字节?

[复制链接]

210

主题

1045

回帖

1685

积分

至尊会员

More we do, more we can do.

积分
1685
发表于 2022-6-10 10:12:35 | 显示全部楼层 |阅读模式
比如一堆数据,原来CRC是算好了的,现在改了已知位置的1个字节,如何使用现有CRC直接计算出新的?
用途是从设计上减少计算量,这种情况太多了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2022-6-10 10:21:20 | 显示全部楼层
这个好像没有。
回复

使用道具 举报

1

主题

72

回帖

75

积分

初级会员

积分
75
发表于 2022-6-10 22:15:29 | 显示全部楼层
CRC好像是把每次计算的结果作为初值进行下一次计算
如果两个包前面有很多数据完全相同,可以先计算相同部分的CRC值,以此作为CRC初值计算后续部分,这样可以节省一部分计算量
回复

使用道具 举报

1

主题

72

回帖

75

积分

初级会员

积分
75
发表于 2022-6-10 22:29:14 | 显示全部楼层
http://www.ip33.com/crc.html上面测试
比如选择CRC-16/CCITT-FALSE,宽度是16,多项式是1021,初始值是FFFF,结果异或值是0000,
此时计算123456(ASCII)得到结果2EF4(Hex),计算1234(ASCII)得到结果5349(Hex)
然后把上面参数中的初始值改成5349,其它参数不变,计算56(ASCII)得到的结果还是2EF4

如果是Modbus协议好像输入输出数据还会反转,这个要特殊处理一下
回复

使用道具 举报

1

主题

72

回帖

75

积分

初级会员

积分
75
发表于 2022-6-11 13:40:56 | 显示全部楼层
还有更快的办法
https://stackoverflow.com/questi ... lculation-in-splits
CRC(a XOR b) == CRC(a) XOR CRC(b)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-17 07:41 , Processed in 0.253515 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表