新建From1(窗体),新建Command1(按钮CommandButton),代码:
Private Sub Command1_Click()
Dim arrA() As Byte
Dim strIP As String
ReDim arrA(3)
arrA(0) = 127
arrA(1) = 166
arrA(2) = 255
arrA(3) = 23
For i = 0 To 3
strIP = strIP & arrA(i) & "."
Next
strIP = Left$(strIP, Len(strIP) - 1)
Debug.Print strIP
End Sub
运行结果:
127.166.255.23
结论:可以看到IPv4可以放在4个字节里面,可以节约空间。
1个字节占8位。
IPv4是4个字节,4*8=32位。
IPv6是16个字节,16*8=128位。
IPv6的地址长度为128位,是IPv4地址长度的4倍。于是IPv4点分十进制格式不再适用,采用十六进制表示。IPv6有3种表示方法。
一、冒分十六进制表示法
格式为X:X:X:X:X:X:X:X,其中每个X表示地址中的16b,以十六进制表示,例如:
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
这种表示法中,每个X的前导0是可以省略的,例如:
2001:0DB8:0000:0023:0008:0800:200C:417A→ 2001:DB8:0:23:8:800:200C:417A
二、0位压缩表示法
在某些情况下,一个IPv6地址中间可能包含很长的一段0,可以把连续的一段0压缩为“::”。但为保证地址解析的唯一性,地址中”::”只能出现一次,例如:
FF01:0:0:0:0:0:0:1101 → FF01::1101
0:0:0:0:0:0:0:1 → ::1
0:0:0:0:0:0:0:0 → ::
三、内嵌IPv4地址表示法
为了实现IPv4-IPv6互通,IPv4地址会嵌入IPv6地址中,此时地址常表示为:X:X:X:X:X:X:d.d.d.d,前96b采用冒分十六进制表示,而最后32b地址则使用IPv4的点分十进制表示,例如::192.168.0.1与::FFFF:192.168.0.1就是两个典型的例子,注意在前96b中,压缩0位的方法依旧适用。
IPv6 地址 ::FFFF:192.168.0.1 可以转换为完整的 IPv6 地址为:0000:0000:0000:0000:0000:FFFF:C0A8:0001。将每一部分转换成16进制后,即为 0000:0000:0000:0000:0000:FFFF:C0A8:0001。
通常在 IPv6 地址中,每个 16 位的块(即 4 个十六进制数字)会使用冒号(:)进行分隔。因此,IPv6 地址的格式通常是 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx。
新建From1(窗体),新建Command1(按钮CommandButton),代码:
Private Sub Command1_Click()
Dim IPv6Dot As String
IPv6Dot = "::FFFF:192.168.0.1"
Debug.Print ConvertIPv6DotToIPv6(IPv6Dot)
End Sub
Private Function ConvertIPv6DotToIPv6(IPv6Dot As String) As String
Dim parts() As String
Dim i As Integer
Dim result As String
' 按冒号分割IPv6Dot地址
parts = Split(IPv6Dot, ":")
' 拼接IPv6地址
For i = 0 To UBound(parts)
If Not InStr(parts(i), ".") = 0 Then
Dim octets() As String
octets = Split(parts(i), ".")
parts(i) = Right("00" & Hex(Val(octets(0))), 2) & Right("00" & Hex(Val(octets(1))), 2) & ":" & Right("00" & Hex(Val(octets(2))), 2) & Right("00" & Hex(Val(octets(3))), 2)
End If
Next i
' 拼接IPv6地址
result = Join(parts, ":")
' 显示转换后的IPv6地址
ConvertIPv6DotToIPv6 = result
End Function
运行结果:
::FFFF:C0A8:0001