打印

【新开贴】一直想不明白的CRC校验算法问题

[复制链接]
3061|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
quakegod|  楼主 | 2009-2-28 08:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
恕敝人少见多怪
偶一直觉得这个CRC算法里面有一个重大的BUG,
就是对一个全0值的数据段进行CRC最后等到的结果居然是0
得到了一个全0的数据包,
而这个全0的数据包恰恰是在出现错误的时候最容易出现的,
然而校验结果居然正确。
假如说,在Flash芯片中存数据,528个字节中,512个存数据,剩16个存校验,
结果这528个字节同时被毁了,也就是说连CRC本身都毁了,都变成0了,
明明数据全都错了,而你处理程序却还傻傻的认为,CRC校验没有错误,数据还可以拿来用的。
又或者说,在数据传输过程中,产生了持续的干扰,使整个数据包的数据都变成全0,
当然,也许有人说了,哪有那么正好,是正好一个包那么多,
没错,但是也许是10.5个包,有1个包能检测出来,但是剩下的10个包都没有被法线错误。
偶不是说CRC算法的问题,而是说,这么一个弱智的BUG怎么会没有被发现呢,怎么还会使用了这么长时间呢。


偶窃以为,应该在生成CRC后,加上一个类似55AA的数据,
这样既不破坏CRC的强壮,也能防止全0包的出现。

再推导到其他校验算法 

偶们常用的校验算法还有很多,
比如说常用的累加值校验算法,
这个算法也会产生同样的BUG,
有些是不能防全0数据,有些是不能防全1数据,
偶自己在做简单的累加和算法时,都会在累加数据上在加上一个固定值,
偶窃以为偶并没有改变算法本身的什么东东,只是改了一下表示方法,
不知道这种方法值不值得提倡。

这个问题偶想了好几年了,一直没好意思说出来。
今天斗胆发言,欢迎大家批评指正。
 
 

相关帖子

沙发
jerkoh| | 2009-2-28 10:52 | 只看该作者

re

我用的一种CRC算法是 比如00 00 00 00 的 CRC值是  84和0C0
这套8位CRC 不会因为全00 而出现校验00 00
另外全FF也不会 4个FF 的CRC值是 1D, 0F

使用特权

评论回复
板凳
wswh2o| | 2009-2-28 11:18 | 只看该作者

CRC算法还有好几种??

0的问题我也想过,在协议中还有其他的字节,做一下判断吧

使用特权

评论回复
地板
HotTIDSP| | 2009-2-28 11:39 | 只看该作者

晕~~~协议协议,“两人协议”,初值不为0即可

使用特权

评论回复
5
HotTIDSP| | 2009-2-28 11:40 | 只看该作者

ff

使用特权

评论回复
6
wswh2o| | 2009-2-28 12:35 | 只看该作者

有时出现错误

收到都是0的情况,正常时当然不用考虑这种情况

使用特权

评论回复
7
quakegod|  楼主 | 2009-2-28 12:37 | 只看该作者

哦,看来

jerkoh完全理解了偶说的意思
而HotTIDSP已经把这招练到了炉火纯情的地步。
那是不是可以这么说,
在CRC或者什么其他的校验算法的基础上,再以此方法稍做修改,是可以使之更健壮的,而这个方法也是值得提倡的呢。

使用特权

评论回复
8
hotpower| | 2018-12-30 00:58 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

1883

帖子

19

粉丝