一、设计
1.1 编码位数
以要发送1101这个数据为例子,假设校验码有m位。为了满足一位纠错能力(即知道哪一位出现了错误),则m位纠错码101这个数据为例子,假设校验码有m位。为了满足一位纠错能力(即知道哪一位出现了错误),则m位纠错码需要能表示4+m+1种状态(+1为没有错的状态)
因此可以推出,若有n位数据,m位校验码,计算插入的校验码位数的公式为:
$$
2^m>m+n+1
$$
1.2 校验方式
使用异或进行校验
由异或的性质可知,如果一个数于它自己本身进行异或,结果为0
假设存在一组数(a1, a2, a3, a4) 设 p = a1 ^ a2 ^ a3 ^ a4
将p和(a1, a2, a3, a4)一起, 设接受端收到的数据为(a1' ,a2' , a3' ,a4' , p')
若发生了1位错误 则 a1' ^ a2' ^ a3' ^ a4' ^ p' = 1,就代表(a1, a2, a3, a4)当中存在传输错误。但这样不能具体知道哪一位出现了错误,则可以使用相交分组的部分,就可以确定哪一位出错。
其中标黄的的位为每组的p,通过相交发部分,就可以确定每一位的内容,而具体分组方式,由1.3中接受端的状态码决定
1.3 状态码
在1101当中,组成的二进制值可以表示8种状态,如下(注意,这里的P3 P2 P1码值 并不是原始插入校验码数据,是接收方用来分辨状态的码值)
P3
P2
P1
value
0
0
0
0
0
0
1
1
0
1
0
2
0
1
1
3
1
0
0
4
1
0
1
5
1
1
0
6
1
1
1
7
为了让状态码值 和 接收的各组数据异或组成的值可以对应起来,则需要按1.2中的分组
二、编码
2.1 计算插入位数
$$
2^m>m+n+1
$$
2.2 计算插入位置
校验码在二进制串中的位置为2的整数幂,即1、2、4、8、16……..剩下的位置是信息码
1
2
3
4
5
6
7
P1
P2
D1
P3
D2
D3
D4
2.3 计算校验码值
从第$2^{n-1}$位开始校验,校验$2^{n-1}$位个,然后跳过$2^{n-1}$位个
1
2
3
4
5
6
7
P1
P2
D1
P3
D2
D3
D4
1
0
1
0
1
0
1
三、解码
接收数据后,进行如下计算
G3 = P3 ^ D2 ^ D3 ^D4
G2 = P2 ^ D1 ^ D3 ^D4
G1 = P1 ^ D1 ^ D2 ^D4
以{P3, P2, P1}, 组成的状态码,查询对应状态
G3
G2
G1
有问题的位
0
0
0
没有问题
0
0
1
1
0
1
0
2
0
1
1
3
1
0
0
4
1
0
1
5
1
1
0
6
1
1
1
7