1.奇偶校验
参考https://blog.csdn.net/u012923751/article/details/80352325
要发送的字节是0x1a,二进制表示为0001 1010。
- 采用奇校验,则在数据后补上个0,数据变为0001 1010 0,数据中1的个数为奇数个(3个)
- 采用偶校验,则在数据后补上个1,数据变为0001 1010 1,数据中1的个数为偶数个(4个)
接收方通过计算数据中1个数是否满足奇偶性来确定数据是否有错。
2.累加和校验
要传输的信息为: 6、23、4
加上校验和后的数据包:6、23、4、33
这里 33 为前三个字节的校验和。接收方收到全部数据后对前三个数据进行同样的累加计算,如果累加和与最后一个字节相同的话就认为传输的数据没有错误。
3.CRC 算法
基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得到的余数作为校验数据附加到原数据后面。
还以上面例子中的数据为例:
6、23、4 可以看做一个2进制数: 0000011000010111 00000010
假如被除数选9,二进制表示为:1001
则除法运算可以表示为:
可以看到,最后的余数为1。如果我们将这个余数作为校验和的话,传输的数据则是:6、23、4、1
CRC 算法和这个过程有点类似,不过采用的不是上面例子中的通常的这种除法。
在CRC算法中,将二进制数据流作为多项式的系数,然后进行的是多项式的乘除法。
还是举个例子吧。
比如说我们有两个二进制数,分别为:1101 和1011。
1101 与如下的多项式相联系:
1011与如下的多项式相联系:
两个多项式的乘法:
得到结果后,合并同类项时采用模2运算。也就是说乘除法采用正常的多项式乘除法,而加减法都采用模2运算。
所谓模2运算就是结果除以2后取余数。比如3 mod 2 = 1。因此,上面最终得到的多项式为:,对应的二进制数:111111
加减法采用模2运算后其实就成了一种运算了,就是我们通常所说的异或运算:
|
0+0=0 0+1=1 1+0=1 1+1=0 |
0-0=0 1-0=1 0-1=1 1-1=0 |
要传输的数据为:1101011011
除数设为:10011
在计算前先将原始数据后面填上4个0:11010110110000.
- 补0的个数:除数位数-1;
- 补0的原因:
最后得到的余数就是CRC 校验字。