当len为0时退出循环。
for(i=0x80i!=0i/=2)
0x80是十六进制数,也即128
当i!=0时,执行循环体,
然后i=i/2,即i值减半。
那么CRC循环冗余校验的原理是什么呢,众所周知在数据帧的最后有一个CRC校验码,这是CRC循环冗余校验的根本所在,那么这个校验码是怎么来的呢?其实这个校验码就是一个余数,被除数是数据段的数据M左移n位(右移后空出来的位置用0填充),除数是收发双方实现原定好的长度为k数据P,那么大伙是不是有疑问那么究竟源数据M要左移几位呢n到底要为多大?其实右移的位数的大小n就是除数位数的k-1。至于为什么请往下看。假设M为1001010,P为1101
我们实际走一下这个过程,这样比较容易理解一点,具体步骤如下:
其实这个和我们小学学的除法区别不大,只有一点不同,注意看你源数据和除数相减时和我们十进制除法是不一样的,这里用的是,模2运算就是进行加减法的时候两个数字同为1或者同为0则结果为0不同则为1。冗余码就是除完以后的余数
所以实际发送的就是数据部分加冗余码即按照上面的例子就时M+冗余码(这里的+不是算算数运算符),即1001010101。看到这里你是不是就明白了为什么冗余码的长度是除数的长度减一了吧。
那么接收端接收到数据以后怎么验证自己收到的数据是不是正确无误的呢,接收端拿到数据以后就直接用数据连上校验码除以已知的除数如果余数位0则数据正确,如果余数不为0则判定该则该帧有误,就丢弃,要注意的是判断只能判断帧是否正确但不能判断帧出错几位或者说在哪个位置出错。
CRC是什么东西呢?其实我们大家都不应该会对它陌生,回忆一下?你用过RAR和ZIP等压缩软件吗?它们是不是常常会给你一个恼人的“CRC校验错误”信息呢?我想你应该明白了吧,CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”,“CRC校验”就是“循环冗余校验欢迎分享,转载请注明来源:内存溢出
评论列表(0条)