海明校验
约 581 字大约 2 分钟
2025-10-15
上周电脑坏了,没更周记,这周更。
最近计组学了海明校验,觉着还挺有意思。为什么需要这个东西懒得过多阐述,本质很简单。
构造
设数据位数为n,校验码位数为k,我们的k要求满足:
2k−1>=n+k
现在说说为什么是这样。假设我们传输的数据为:
1010110
我们如果使用奇偶检验错误率极高。但我们想如果引入多个校验位就可以降低检验的错误率。我们可以利用小小的数学性质,在每个2的幂次位置插上一个校验位,再通过异或运算就可以扩大覆盖面,容错率极高。
在1010110中,n=7,所以我们算出k=4。我们就在20,21,22,23处插入校验码。设校验码分别为x0,x1,x2,x3,我们要传输的带海明校验码的数据即为x0x11x2010x3110。
我们若要求xi的值,就要把传输数据的位数(从左往右由1开始升序)转为二进制后,所有第i位(这里的i是二进制算法,从右往左由0开始升序)为1对应的数全部异或。将异或后的值取反即为xi。
比如x0x11x2010x3110中,我如果要算x1,3,6,7,10,11位满足条件。这时将他们全部异或1⊕1⊕0⊕1⊕0=0。所以x2=1。
疑问
你可能要问了,要是异或式子中取到了未知数怎么办?好问题。你可以再看看,取不取得到?
传输后检验
我们拿到传输过来的数据后,将每个校验码与对应的值异或运算,如果结果不为1则说明其对应的值出现了错误。可一个校验码对应多个值要怎么办呢?好消息是一个值也有可能对应多个校验码。你可以通过排除法来确定出问题的范围。
其实还有更简单的方法,我们可以将所有校验码的异或结果拼接成一个二进制数,这个二进制数对应的十进制数即为错误的位置。
