1、ipv6转换为十进制数
IPv6的地址长度为128位,是IPv4地址长度的4倍。于是IPv4点分十进制格式不再适用,采用十六进制表示。IPv6有3种表示方法。
(1) 冒分十六进制表示法
格式为X:X:X:X:X:X:X:X,其中每个X表示地址中的16位,以十六进制表示,例如:
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
(2) 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 → ::
(3) 内嵌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转换为十进制数
def ipv62dec(ipv6):
if checkipv6(ipv6):
compressIndex = ipv6.find('::')
print("compressIndex:"+str(compressIndex))
ipv4Index = ipv6.find('.')
print("ipv4Index:"+str(ipv4Index))
if compressIndex==-1 and ipv4Index==-1:
return noCompressipv62dec(ipv6)
elif compressIndex!=-1 and ipv4Index==-1:
return compressipv62dec(ipv6)
elif compressIndex==-1 and ipv4Index!=-1:
ipv4,ipv6=ipv4v6Split(ipv6)
if ipv4 and ipv6:
return str(int(ipv42dec(ipv4))+int(noCompressipv62dec(ipv6)))
else:
return ""
elif compressIndex != -1 and ipv4Index != -1:
ipv4, ipv6 = ipv4v6Split(ipv6)
if ipv4 and ipv6:
return str(int(ipv42dec(ipv4))+int(compressipv62dec(ipv6)))
else: