某编码由4个信息位和3个校验位组成,通过对编码信息进行验算,能够检测并纠正一位错误代码。该7位编码中b1~b4为信息位,p1~p3为校验位,位置如下:
编码中位
1
2
3
4
5
6
7
对位信息
p1
p2
b1
p3
b2
b3
b4
校验的方式如下,求校验值g1、g2、g3:
g1 = p1 Xor b1 Xor b2 Xor b4
g2 = p2 Xor b1 Xor b3 Xor b4
g3 = p3 Xor b2 Xor b3 Xor b4
其中Xor 为异或运算,规则是:0 Xor 0 =0,0 Xor 1 =1,1 Xor 0 =1,1 Xor 1 =0,
p1 Xor b1 是将p1、b1 转换为二进制后按位进行异或运算,如7 Xor 12 的结果为11。
⑴若计算得到的校验值g1、g2、g3均为0,说明校验正确,数据无错误。例如:若7位编码为1101001,计算校验值g1、g2、g3值均为0,验证正确。
⑵若校验值g1、g2、g3不全为0,说明数据有错,出错位置为g3g2g1(二进制数表示),纠错的方法是对错误的位进行取反,即“0”变“1”,“1”变“0”。例如:若7位编码为1111001,计算校验值g1=1、g2=1、g3=0,不全为0,说明数据有错,错误位置在011(二进制数)位,即第3位,原位置上“1”应为“0”,正确编码为1101001。
小明为此编写了VB程序,程序运行时,在文本框Text1中输入编码值,单击“校验”
按钮Command1后,在文本框Text2中输出运行结果,如图所示。
实现上述功能的VB程序如下,请回答下列问题:
(1)
若按上述规则的7位编码为1001000,其中一位有错,则正确的编码应为。
(2)
请在划线处填入合适的代码。
Function check(s As String) As Integer
Dim i As Integer g1 As Integer, g2 As Integer, g3 As Integer
Dim c(1 To 7) As Integer
For i = 1 To 7
c(i) = Val(Mid(s, i, 1))
Next i
g1 = c(1) Xor c(3) Xor c(5) Xor c(7)
g2 = c(2) Xor c(3) Xor c(6) Xor c(7)
g3 = c(4) Xor c(5) Xor c(6) Xor c(7)
If g1 + g2 + g3 = 0 Then check = 0 Else check =
End Function
Private Sub Command1_Click()
Dim i As Integer, m As Integer, Outs As String
m =
If m = 0 Then
Text2.Text = "验证正确,数据无错误"
Else
For i = 1 To 7
If i = m Then
Outs = Outs + Chr( Asc(Mid(Text1.Text, i, 1)) Xor )
Else
Outs = Outs + Mid(Text1.Text, i, 1)
End If
Next i
Text2.Text = "第" + Str(m) + "位上数据有错误,正确编码应为:" + Outs
End If
End Sub
答案: 【1】1001100
【1】g3 * 4 + g2 * 2 + g1【2】check(Text1.Text)【3】1