IPv6与整数的互相转换

333 阅读1分钟

1.IPv6转整数

for 循环,每16位(也就是每个:分割的元素),进行一次 16 进制转 10 进制,并且将上一次的的结果扩大 2 的 16 次方,也就是左移 16 位,以此来满足权重

2.整数转IPv6

  1. 使用struct.pack将整数转为打包的IP地址,因为只能处理 8 个字节,所以我们将 16 字节的 IPv6 分为两部分,前 64 位和后 64 位,然后再使用struct.pack
  2. 使用socket.inet_ntop转换一个打包IP地址为标准字符串表达式
# IPv6转整数
def ipv6_to_int(ipv6):
    groups = ipv6.split(':')
    result = 0
    for group in groups:
        group_value = int(group, 16)
        result = (result << 16) + group_value
    return result

# 整数转IPv6
def ipv6_int_to_str(ip_int):
    hi = (ip_int >> 64) & 0xFFFFFFFFFFFFFFFF;
    lo = ip_int & 0xFFFFFFFFFFFFFFFF
    ip_pack = struct.pack('!QQ', hi, lo)
    return socket.inet_ntop(socket.AF_INET6, ip_pack)