发新帖我要提问
12
返回列表
打印

CRC16真是不可靠啊,这就是什么“碰撞”吗?

[复制链接]
楼主: helloop
手机看帖
扫描二维码
随时随地手机跟帖
21
kseeker| | 2012-3-16 16:21 | 只看该作者 回帖奖励 |倒序浏览
LZ对CRC的工作原理理解有误。CRC适用于校验数据传输过程中偶然发生的个别位的改变,如果线路非常不稳定,则CRC校验很可能出错。
对于标准CRC16多项式G(x) = x16 + x15 + x2 + 1,有下面的特性:
1,所有长度r < 16的突发错误。
2,所有影响奇数个比特韦德任意长度的突发错误。
3,以(2^(r-1) - 1)/2^(r-1)的概率检测出所有长度为r+1的突发错误。
4,以(2^r - 1) / 2^r的概率检测出所有长度>r+1的突发错误。
总的来说,如果你的一个数据包有一定概率出现2处错误,CRC就不适合你。移动硬盘之类的数据线相对来说是比较可靠的,所以CRC就够用了。但是网络传输中CRC32则不是那么可靠,所以很多网站会提供下载文件的SHA或MD5值作为校验。

使用特权

评论回复
22
kseeker| | 2012-3-16 16:27 | 只看该作者
按上面第4条,大多数情况下CRC32也还算够用,但实际网络传输中确实出现过CRC32碰撞的例子。而CRC16则仅应该用于可靠线路传输。

使用特权

评论回复
23
icecut| | 2012-3-16 17:12 | 只看该作者
crc只能 用于校验.不能用于长度判断.....lz用错地方了

使用特权

评论回复
24
李冬发| | 2012-3-16 18:16 | 只看该作者
按抽屉原理,你有65536组数据,至少有2组的数据的CRC值是相同的。

使用特权

评论回复
25
qq65411253| | 2012-3-16 18:36 | 只看该作者
可以用换个一个多项式计算一下,两个结果一样时再采用。

使用特权

评论回复
26
zyok| | 2012-3-16 22:27 | 只看该作者
呵呵,和lz一样,也是射频信号,俺的24位CRC也经常有错误的报文。。。

使用特权

评论回复
27
gx_huang| | 2012-3-17 13:20 | 只看该作者
10年前,做寻呼机CRC解码,发现误码的信号,采用不同的纠错,有不同的结果。
而且经常碰到。
所以,通信通道本身的误码率要低,CRC才有意义。

使用特权

评论回复
28
gong12345| | 2012-3-20 11:25 | 只看该作者
帧头、长度、校验,这些都有就行了

使用特权

评论回复
29
hotpower| | 2012-3-28 15:05 | 只看该作者
30
coody| | 2012-3-28 15:26 | 只看该作者
MODBUS我从90年代就开始用了,暂时没发现有碰状的情况

使用特权

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

本版积分规则