IPv6格式转换(全写转简写)

有些需要支持ipv6的功能,在展示ip时当然是展示简写ip,但是在收包的时候都是全写ip,需要将其转换:

# -*- coding=UTF-8 -*-
def ipv6_trans(addr_v6):
    list_v = []
    for x in addr_v6.split(":"):
        if x == "0000" or x == "0":
            list_v.append("0")
        else:
            list_v.append(x.lstrip("0"))

    first, second = 0, 0
    for i in range(len(list_v)-1):
        if first == second and (list_v[i+1] != "0" or list_v[i] != "0"):
            continue
        elif first == second and list_v[i] == "0" and list_v[i+1] == "0":
            first, second = i, i+1
        elif list_v[i] == "0":
            second += 1
        else:
            break

    if second == (len(list_v)-1) and list_v[-1] == "0":
        second += 1

    if first != second:
        a, b, c = list_v[0: first], list_v[first: second], list_v[second:]
        ret = ":".join(a) + "::" + ":".join(c)
    else:
        ret = ":".join(list_v)

    return ret

def main():
    # ipv6 = "ff06:0:0:0:0:0:0:c3"
    ipv6_1 = "0000:ff06:0000:0000:0000:0000:0000:0000"
    ipv6_2 = "0000:0000:0000:0000:0000:0000:0000:0000"
    ipv6_3 = "ff02:0000:0000:0000:0000:0001:ff00:0001"
    ipv6_4 = "fd82:139b:8752:0000:246e:0031:888c:36db"
    ipv6_5 = "fd82:0000:8752:0000:0000:0031:888c:36db"
    ipv6_6 = "fd82:0000:0000:8752:0000:0031:888c:36db"
    ipv6_list = [ipv6_1, ipv6_2, ipv6_3, ipv6_4, ipv6_5, ipv6_6]
    for element in ipv6_list:
        print(ipv6_trans(element))

if __name__ == '__main__':
    main()

输出结果:

0:ff06::
::
ff02::1:ff00:1
fd82:139b:8752:0:246e:31:888c:36db
fd82:0:8752::31:888c:36db
fd82::8752:0:31:888c:36db
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值