Open sworlife opened 3 years ago
通过增加冗余位使得二进制码中的“1”的个数恒为奇数或偶数的编码方法,它是一种检错码。
将二进制串按固定长度(比如:8)进行分组,每组产生一个奇偶校验码,而后将数据与校验码拼接在一起形成新的数据进行传输
将二进制串按固定长度进行分组,如果将每组一行进行整齐排列,然后再加一行校验码,这样不同组的二进制串,但处于相同位置的二进制位产生对应的校验码。
海明码同样是利用奇偶性来检错和纠错的校验方法。
与奇偶校验码不同的是:在数据位中插入的校验位不是平均分布,而是海明码的 2^(i-1) 的位置(i 就是指第 i 个校验码)
如上图,对于 5 位数据来说,海明码则需要 4 个校验位,编码后变为:
现在,我们确定了校验码的个数以及分布的位置,接下来就应该知道各校验位的值。
既然海明码也是利用奇偶性来检错,那么校验位的值则取决于它所校验的位,然后根据偶校验规则进行求值,因此,接下来我们需要知道每个校验位校验的数据位有哪些?
根据数据位在编码后的位置(二进制)与校验位组成的二进制进行一一匹配,如下表:
横向看,数据位将由校验位值为 1 的校验位负责校验,例如:D1 由 { P1, P2 } 校验,D2 由 { P3, P1 } 校验。
纵向看,便可以知道每个校验位需要校验哪些数据位,结果如下:
P1 校验 { D1, D2, D4, D5 }
P2校验 { D1, D3, D4 }
P3 校验 { D2, D3, D4 }
P4 校验 { D5 }
以 5 位数据:10010 为例:
接口第一步和第三步的结果,以数据 10010 进行海明码编码后的数据位:110011000。
如果 G4G3G2G1 的值为 0000,则表示数据位传输正确。
如果 G4G3G2G1 的值不为 0000,则表示其值所表示的位置(十进制)数据传输发生了错误。
偶校验正确的结果为0,错误为 1,更方便用来判断和纠错
结合第二步中的数据位被哪些校验码校验的表格来看:
可以发现:任何一位数据出错,那么校验它的校验码的位置(G*)的校验结果就会是 1(出错)。因此 G4G3G2G1 所表示的二进制与该数据位位置的二进制一致。
循环冗余校验码(CRC)简称循环码,是一种常用的,具有检错,纠错能力的校验码。它是通过某种数学运算来建立数据位和校验位的约定关系的。
奇偶校验码和海明校验码都是采用奇偶校验为手段检错和纠错的(奇偶校验码不具有纠错能力)。
将要传送的信息M(x)表示为一个多项式 L,用 L 除以一个预先确定的多项式 G(X),得到的余式就是所需的循环冗余校验码。
这种校验又称为多项式校验。
理论上,循环冗余校验码具有以下特点:
可检测出所有奇数为错
可检测出所有双比特的错
可检测出所有小于、等于校验位长度的突发错
校验位在信息位后面,其长度为 k+r (k:数据位个数,r:校验位个数)
奇偶校验码和海明码的数据位和校验位是穿插的
根据其编码的基本思想可总结位一句话:利用生产多项式为 k 个数据位产生 r 个校验位来进行编码。
因此,要计算校验位,就需要定义一个生成多项式。
举例说明:
数据:10101011;生成多项式为:10011(2^4 + 2^1 + 2^0)
数据位后加多项式最高幂次个0,也就是 4,变成:101010110000,用作被除数
将多项式 10011 作为除数进行短除运算。但是采用的是模 2 (XOR,异或)运算,也就是做减法不影响其他位。
最后得到的余数:1010,即校验位。
CRC码位:10101011 1010
假设接收到的CRC码还是 10101011 1010,那就用 CRC 码与生成多选式进行短除,余数为 0,则代表传输正确
假设接收到的CRC码变成 10001011 1010,CRC 码与 生成多项式进行短除,余数为 1010,则说明第 10 位数据发生错误。
校验和 · 语雀
奇偶校验码
通过增加冗余位使得二进制码中的“1”的个数恒为奇数或偶数的编码方法,它是一种检错码。
水平奇偶校验
将二进制串按固定长度(比如:8)进行分组,每组产生一个奇偶校验码,而后将数据与校验码拼接在一起形成新的数据进行传输
垂直奇偶校验
将二进制串按固定长度进行分组,如果将每组一行进行整齐排列,然后再加一行校验码,这样不同组的二进制串,但处于相同位置的二进制位产生对应的校验码。
水平垂直奇偶校验
海明码
海明码同样是利用奇偶性来检错和纠错的校验方法。
第一步:确认校验码的位置
与奇偶校验码不同的是:在数据位中插入的校验位不是平均分布,而是海明码的 2^(i-1) 的位置(i 就是指第 i 个校验码)
如上图,对于 5 位数据来说,海明码则需要 4 个校验位,编码后变为:
现在,我们确定了校验码的个数以及分布的位置,接下来就应该知道各校验位的值。
第二步:确认各校验码校验哪些数据位
既然海明码也是利用奇偶性来检错,那么校验位的值则取决于它所校验的位,然后根据偶校验规则进行求值,因此,接下来我们需要知道每个校验位校验的数据位有哪些?
根据数据位在编码后的位置(二进制)与校验位组成的二进制进行一一匹配,如下表:
横向看,数据位将由校验位值为 1 的校验位负责校验,例如:D1 由 { P1, P2 } 校验,D2 由 { P3, P1 } 校验。
纵向看,便可以知道每个校验位需要校验哪些数据位,结果如下:
P1 校验 { D1, D2, D4, D5 }
P2校验 { D1, D3, D4 }
P3 校验 { D2, D3, D4 }
P4 校验 { D5 }
第三步:计算校验码的值
以 5 位数据:10010 为例:
第四步:确定编码后的数据
接口第一步和第三步的结果,以数据 10010 进行海明码编码后的数据位:110011000。
第五步:校验和纠错
如果 G4G3G2G1 的值为 0000,则表示数据位传输正确。
如果 G4G3G2G1 的值不为 0000,则表示其值所表示的位置(十进制)数据传输发生了错误。
TIPS
偶校验正确的结果为0,错误为 1,更方便用来判断和纠错
结合第二步中的数据位被哪些校验码校验的表格来看:
可以发现:任何一位数据出错,那么校验它的校验码的位置(G*)的校验结果就会是 1(出错)。因此 G4G3G2G1 所表示的二进制与该数据位位置的二进制一致。
循环冗余校验码
循环冗余校验码(CRC)简称循环码,是一种常用的,具有检错,纠错能力的校验码。它是通过某种数学运算来建立数据位和校验位的约定关系的。
编码的基本思想
将要传送的信息M(x)表示为一个多项式 L,用 L 除以一个预先确定的多项式 G(X),得到的余式就是所需的循环冗余校验码。
这种校验又称为多项式校验。
理论上,循环冗余校验码具有以下特点:
可检测出所有奇数为错
可检测出所有双比特的错
可检测出所有小于、等于校验位长度的突发错
结构
校验位在信息位后面,其长度为 k+r (k:数据位个数,r:校验位个数)
计算校验位
根据其编码的基本思想可总结位一句话:利用生产多项式为 k 个数据位产生 r 个校验位来进行编码。
因此,要计算校验位,就需要定义一个生成多项式。
举例说明:
数据:10101011;生成多项式为:10011(2^4 + 2^1 + 2^0)
数据位后加多项式最高幂次个0,也就是 4,变成:101010110000,用作被除数
将多项式 10011 作为除数进行短除运算。但是采用的是模 2 (XOR,异或)运算,也就是做减法不影响其他位。
最后得到的余数:1010,即校验位。
CRC码位:10101011 1010
校验
假设接收到的CRC码还是 10101011 1010,那就用 CRC 码与生成多选式进行短除,余数为 0,则代表传输正确
假设接收到的CRC码变成 10001011 1010,CRC 码与 生成多项式进行短除,余数为 1010,则说明第 10 位数据发生错误。
校验和
校验和 · 语雀