校验码之海明码
为减少或避免数据在计算机系统内形成、存取或传输过程中产生的错误,除了提升相关硬件的可靠性之外,还可以在数据编码上采取检错,纠错的机制。因此,具有检错或纠错能力的数据校验码应运而生。
实现原理
数据校验码的实现原理,即在正常编码中加入一些冗余位,使得正常编码组中包含一些非法编码。当合法数据编码出现某些错误时,就变成了非法编码。因此,我们可以通过检查编码的合法性来达到错误检测,定位乃至改正的目的。
编码距离
我们通常将一组编码中任意两个编码之间代码不同的位数称为这两个编码的距离,也称海明距离
。如$0011$与$0001$的海明距离为$1$。
判断一组编码有无查错、纠错能力只需判断其码距是否大于$1$。
码距与检错能力和纠错能力的关系
码距 | 校验码的检错能力/纠错能力 |
---|---|
$d\ge e+1$ | 可检$e$个错 |
$d\ge2t+1$ | 可纠$t$个错 |
$d\ge e+t+1$且$e>t$ | 可检$e$个错且可纠$t$个错 |
奇偶校验码
奇偶校验又称垂直冗余校验。若采用奇校验,发送端发送一个字符编码($8$位编码含校验位),其中“$1$”的个数一定为奇数个。接收端即对编码中“$1$”的个数进行统计。若非奇数则说明发生了差错。偶校验反之亦然。
奇偶校验码的缺点在于其仅能发现奇数个错误,且无法纠错。
海明校验码
海明校验码是以奇偶校验码为基础,通过增加码距构成多组奇偶校验来达到差错检测及自动纠正的功能。
校验位数
设有效信息位数为$n$,校验位数为$k$,则能够检测$1$位错误并纠正$1$位错误的海明码应满足表达式:$2^k\ge n+k+1$。如数据位为$8$位,则由公式$2^k\ge 8+k+1=k+9$可知利用海明码编码时校验位应为$4$位。
由以上公式可计算得到数据位$n$与校验位$k$的对应关系:
数据位$n$ | 最小$k$值 |
---|---|
$1$ | $2$ |
$2\text{~}4$ | $3$ |
$5\text{~}11$ | $4$ |
$12\text{~}26$ | $5$ |
$27\text{~}57$ | $6$ |
$58\text{~}120$ | $7$ |
编码方法
将校验码下标从左至右按$1$到$n+k$排列,则校验位下标分别为$2^i(i=0,\cdots,k)$。
$\text{H}_1$ | $\text{H}_2$ | $\text{H}_3$ | $\text{H}_4$ | $\text{H}_5$ | $\text{H}_6$ | $\text{H}_7$ | $\text{H}_8$ | $\text{H}_9$ | $\text{H}_{10}$ | $\text{H}_{11}$ | $\text{H}_{12}$ | $\cdots$ |
---|---|---|---|---|---|---|---|---|---|---|---|---|
$\text{P}_1$ | $\text{P}_2$ | $\text{D}_1$ | $\text{P}_4$ | $\text{D}_2$ | $\text{D}_3$ | $\text{D}_4$ | $\text{P}_8$ | $\text{D}_5$ | $\text{D}_6$ | $\text{D}_7$ | $\text{D}_8$ | $\cdots$ |
$k$个校验位构成$k$组奇偶校验。
校验分组
对于下标为$2^i(i=0,\cdots,k)$的校验位,其对应的分组方法为==先取$2^i$开头的连续$2^i$位,然后连续去掉$2^i$位,再取$2^i$位,以此类推==:
由于奇偶校验同一原理,则以偶校验为例,每一行都是从对应的校验位开始校验。设有数据$01101001$,则其对应的校验位数为$4$。根据上表,有