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

[复制链接]
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值作为校验。
kseeker 发表于 2012-3-16 16:27 | 显示全部楼层
按上面第4条,大多数情况下CRC32也还算够用,但实际网络传输中确实出现过CRC32碰撞的例子。而CRC16则仅应该用于可靠线路传输。
icecut 发表于 2012-3-16 17:12 | 显示全部楼层
crc只能 用于校验.不能用于长度判断.....lz用错地方了
李冬发 发表于 2012-3-16 18:16 | 显示全部楼层
按抽屉原理,你有65536组数据,至少有2组的数据的CRC值是相同的。
qq65411253 发表于 2012-3-16 18:36 | 显示全部楼层
可以用换个一个多项式计算一下,两个结果一样时再采用。
zyok 发表于 2012-3-16 22:27 | 显示全部楼层
呵呵,和lz一样,也是射频信号,俺的24位CRC也经常有错误的报文。。。
gx_huang 发表于 2012-3-17 13:20 | 显示全部楼层
10年前,做寻呼机CRC解码,发现误码的信号,采用不同的纠错,有不同的结果。
而且经常碰到。
所以,通信通道本身的误码率要低,CRC才有意义。
gong12345 发表于 2012-3-20 11:25 | 显示全部楼层
帧头、长度、校验,这些都有就行了
hotpower 发表于 2012-3-28 15:05 | 显示全部楼层
coody 发表于 2012-3-28 15:26 | 显示全部楼层
MODBUS我从90年代就开始用了,暂时没发现有碰状的情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部
快速回复 在线客服 返回列表 返回顶部