同时,对于多个地址块为 0 的情况时,可以使用”::”号,进行化简。化简原则:
①全 0 块“0000”,可以化简为“0”
②连续多个全 0 块,可以化简为“::”
③一个 IPv6 地址中只能出现一个“::”,出现多个全 0 块时,“::”要化简最长的一段,没有最长的就将最左侧的一段化简为“::”
④“::”可以出现在地址开头或结尾
(1)实现上述功能的 VB 程序如下,请回答下列问题:
请在划线处填入合适的代码。
Private Sub Text1_Change()
Dim a(1 To 8) As String, ipstr As String, ips As String
Dim lenth As Integer, max_lenth As Integer, start As Integer
ipstr = Text1.Text
For i = 1 To 8
a(i) = __①__ ' 将 IPv6 分 段 存 入 数 组 a
Next i
'对数组进行处理,如果字母或非零数字开头,则不用处理;如果全是数字,则压缩成 0,如果前导为 0,则去掉,处理完毕存回数组。
'///------ 处理过程略 /////
'如果只有一串,则将该串“0”用“::”代替,如果不止一串,则将最长的一串“0”简化为“::”,如果有连续 0,则将左边的一串零简化,右侧保留。
max_lenth = 0
For i = 1 To 7
If __②__ Then
lenth = lenth + 1
Else
If lenth > max_lenth Then
max_lenth = lenth: start = i - lenth: lenth = 0
End If
End If
Next i
If lenth > max_lenth Then max_lenth = lenth: start = i - lenth
'根据连续 0 串的位置确定输出简化后的结果
ips = ""
If start = 1 And max_lenth = 7 Then ' 开 头 是 0 且 全 0
ips = "::"
ElseIf start = 1 Then ' 开 头 是 0 但 不 全 为 0
ips = "::"
For i = start + max_lenth + 1 To 7
ips = ips + a(i) + ":"
Next i
ips = ips + a(i)
ElseIf start > 1 And start + max_lenth = 8 Then '开头不是 0 但 0 到最后
For i = 1 To start - 1
ips = ips + a(i) + ":"
Next i
ips = ips + ":"
ElseIf start > 1 Then ' 开 头 不 是 0 且 0 不 到 最 后
For i = 1 To start - 1
ips = ips + a(i) + ":"
Next i
ips = ips + ":"
For i = __③__ To 7
ips = ips + a(i) + ":"
Next i
ips = ips + a(i)
Else ' 无 连 续 0 出 现
For i = 1 To 7
ips = ips + a(i) + ":"
Next i
ips = ips + a(i)
End If
Text2.Text = ips End Sub
(2)IPv6 地址:3BCD:0000:0000:ABCD:0000:0000:0000:6789, 则化简后为 ______ 。
【答案】
(1)① Mid(ipstr, (i - 1) * 5 + 1, 4)
②a(i) = "0" And a(i) = a(i + 1)
③start + max_lenth + 1
(2)3BCD:0:0:ABCD::6789