FE-DSHUI / DSHUI

前端王者小分队读书会
4 stars 1 forks source link

《专题:二进制数据校验方式》——2021-03-17 #66

Open sworlife opened 3 years ago

sworlife commented 3 years ago

奇偶校验码

通过增加冗余位使得二进制码中的“1”的个数恒为奇数或偶数的编码方法,它是一种检错码。

水平奇偶校验

将二进制串按固定长度(比如:8)进行分组,每组产生一个奇偶校验码,而后将数据与校验码拼接在一起形成新的数据进行传输

垂直奇偶校验

将二进制串按固定长度进行分组,如果将每组一行进行整齐排列,然后再加一行校验码,这样不同组的二进制串,但处于相同位置的二进制位产生对应的校验码。

水平垂直奇偶校验

海明码

海明码同样是利用奇偶性来检错和纠错的校验方法。

第一步:确认校验码的位置

与奇偶校验码不同的是:在数据位中插入的校验位不是平均分布,而是海明码的 2^(i-1) 的位置(i 就是指第 i 个校验码)

9 8 7 6 5 4 3 2 1 位数
D5 D4 D3 D2 D1 数据位
P4 P3 P2 P1 校验位

如上图,对于 5 位数据来说,海明码则需要 4 个校验位,编码后变为:

现在,我们确定了校验码的个数以及分布的位置,接下来就应该知道各校验位的值。

第二步:确认各校验码校验哪些数据位

既然海明码也是利用奇偶性来检错,那么校验位的值则取决于它所校验的位,然后根据偶校验规则进行求值,因此,接下来我们需要知道每个校验位校验的数据位有哪些?

根据数据位在编码后的位置(二进制)与校验位组成的二进制进行一一匹配,如下表:

数据位 位数 二进制 P4 P3 P2 P1
D1 3 0011 0 0 1 1
D2 5 0101 0 1 0 1
D3 6 0110 0 1 1 0
D4 7 0111 0 1 1 1
D5 9 1001 1 0 0 1

横向看,数据位将由校验位值为 1 的校验位负责校验,例如:D1 由 { P1, P2 } 校验,D2 由 { P3, P1 } 校验。

纵向看,便可以知道每个校验位需要校验哪些数据位,结果如下:

P1 校验 { D1, D2, D4, D5 }

P2校验 { D1, D3, D4 }

P3 校验 { D2, D3, D4 }

P4 校验 { D5 }

第三步:计算校验码的值

以 5 位数据:10010 为例:

校验位 校验位的值 被校验的数据位 被校验的位置
P1 0 1010 D1, D2, D4, D5
P2 0 000 D1, D3, D4
P3 1 001 D2, D3, D4
P4 1 1 D5

第四步:确定编码后的数据

接口第一步和第三步的结果,以数据 10010 进行海明码编码后的数据位:110011000。

第五步:校验和纠错

校验错误 偶校验
G1 P1,D1, D2, D4, D5
G2 P2,D1, D3, D4
G3 P3,D2, D3, D4
G4 P4,D5

TIPS

偶校验正确的结果为0,错误为 1,更方便用来判断和纠错

结合第二步中的数据位被哪些校验码校验的表格来看:

数据位 位数 二进制 P4 P3 P2 P1
D1 3 0011 0 0 1 1
D2 5 0101 0 1 0 1
D3 6 0110 0 1 1 0
D4 7 0111 0 1 1 1
D5 9 1001 1 0 0 1

可以发现:任何一位数据出错,那么校验它的校验码的位置(G*)的校验结果就会是 1(出错)。因此 G4G3G2G1 所表示的二进制与该数据位位置的二进制一致。

循环冗余校验码

循环冗余校验码(CRC)简称循环码,是一种常用的,具有检错,纠错能力的校验码。它是通过某种数学运算来建立数据位和校验位的约定关系的。

奇偶校验码和海明校验码都是采用奇偶校验为手段检错和纠错的(奇偶校验码不具有纠错能力)。

编码的基本思想

将要传送的信息M(x)表示为一个多项式 L,用 L 除以一个预先确定的多项式 G(X),得到的余式就是所需的循环冗余校验码。

这种校验又称为多项式校验。

理论上,循环冗余校验码具有以下特点:

  1. 可检测出所有奇数为错

  2. 可检测出所有双比特的错

  3. 可检测出所有小于、等于校验位长度的突发错

结构

校验位在信息位后面,其长度为 k+r (k:数据位个数,r:校验位个数)

奇偶校验码和海明码的数据位和校验位是穿插的

计算校验位

根据其编码的基本思想可总结位一句话:利用生产多项式为 k 个数据位产生 r 个校验位来进行编码。

因此,要计算校验位,就需要定义一个生成多项式。

举例说明:

数据:10101011;生成多项式为:10011(2^4 + 2^1 + 2^0)

  1. 数据位后加多项式最高幂次个0,也就是 4,变成:101010110000,用作被除数

  2. 将多项式 10011 作为除数进行短除运算。但是采用的是模 2 (XOR,异或)运算,也就是做减法不影响其他位。

  1. 最后得到的余数:1010,即校验位。

  2. CRC码位:10101011 1010

校验

假设接收到的CRC码还是 10101011 1010,那就用 CRC 码与生成多选式进行短除,余数为 0,则代表传输正确

假设接收到的CRC码变成 10001011 1010,CRC 码与 生成多项式进行短除,余数为 1010,则说明第 10 位数据发生错误。

校验和

校验和 · 语雀