zoukankan      html  css  js  c++  java
  • python IPv6 十进制和十六进制互转

    IPv6 转 十进制:

      1 #!/usr/bin/python
      2 # -*- coding: UTF-8 -*-
      3 
      4 import re
      5 
      6 def ipv62dec(ipv6):
      7     if checkipv6(ipv6):
      8         compressIndex = ipv6.find('::')
      9         print("compressIndex:"+str(compressIndex))
     10 
     11         ipv4Index = ipv6.find('.')
     12         print("ipv4Index:"+str(ipv4Index))
     13 
     14         if compressIndex==-1 and ipv4Index==-1:
     15             print 'num: %d' % (noCompressipv62dec(ipv6))
     16         elif compressIndex!=-1 and ipv4Index==-1:
     17             print 'num: %d' % (compressipv62dec(ipv6))
     18         elif compressIndex==-1 and ipv4Index!=-1:
     19             ipv4,ipv6=ipv4v6Split(ipv6)
     20             if ipv4 and ipv6:
     21                 print 'num: %d' % (ipv42dec(ipv4)+noCompressipv62dec(ipv6))
     22             else:
     23                 return ""
     24         elif compressIndex != -1 and ipv4Index != -1:
     25             ipv4, ipv6 = ipv4v6Split(ipv6)
     26             if ipv4 and ipv6:
     27                 print 'num: %d' % (ipv42dec(ipv4)+compressipv62dec(ipv6))
     28             else:
     29                 return ""
     30         else:
     31             return ""
     32     else:
     33         return ""
     34 
     35 def ipv42dec(ip):
     36     dec_value = 0
     37     v_list = ip.split('.')
     38     v_list.reverse()
     39     t = 1
     40     for v in v_list:
     41         dec_value += int(v) * t
     42         t = t * (2 ** 8)
     43     return dec_value
     44 
     45 #Ipv6每段不补齐0 形成完整的4位,如2001:DB8:0:23:8:800:200C:417A,补齐为2001:0DB8:0000:0023:0008:0800:200C:417A
     46 def ipseg2str(ipseglist):
     47     ipstr=''
     48     for ipseg in ipseglist:
     49         if len(ipseg) == 1:
     50             ipseg = '000' + ipseg
     51         elif len(ipseg) == 2:
     52             ipseg = '00' + ipseg
     53         elif len(ipseg) == 3:
     54             ipseg = '0' + ipseg
     55         elif len(ipseg) == 4:
     56             ipseg = ipseg
     57         else:
     58             return ""
     59         ipstr += ipseg
     60     return ipstr
     61 
     62 ##没有0压缩的Ipv6转换为十进制,如2001:DB8:0:23:8:800:200C:417A
     63 def noCompressipv62dec(ipv6):
     64     iplist = ipv6.split(":")
     65     if iplist:
     66         ipstr = ipseg2str(iplist)
     67         print(ipstr)
     68         return int(ipstr, 16)
     69     else:
     70         return ""
     71 
     72 #带0压缩的ipv6转换为十进制,如FF01::1101
     73 def compressipv62dec(ipv6):
     74     compressList = ipv6.split("::")
     75     print("compressList:" + str(compressList))
     76     ipstr = ""
     77     part1 = []
     78     part2 = []
     79     if len(compressList) == 2:
     80         part1 = compressList[0].split(":") if compressList[0] else []
     81         part2 = compressList[1].split(":") if compressList[1] else []
     82     if part1 or part2:
     83         ipstr += ipseg2str(part1)
     84         for i in range(8 - len(part1) - len(part2)):
     85             ipstr += '0000'
     86         ipstr += ipseg2str(part2)
     87         print("ipstr:" + ipstr)
     88         return int(ipstr, 16)
     89     else:
     90         return ""
     91 
     92 #将内嵌ipv4的ipv6中的ipv6和ipv4分隔开,如FFFF::192.168.0.1  分隔为ipv4 192.168.0.1  ipv6 FFFF::0000:0000
     93 def ipv4v6Split(ipv6):
     94     ipv4str = ''
     95     ipv6str = ''
     96     if checkipv6(ipv6):
     97         list = ipv6.split(":")
     98         if list:
     99             ipv4str = list[len(list) - 1]
    100             list.pop()
    101             ipv6str = ":".join(list) + ":0000:0000"
    102             print("ipv4:" + ipv4str)
    103             print("ipv6:" + ipv6str)
    104     return ipv4str,ipv6str
    105 
    106 #校验ipv6的格式
    107 def checkipv6(ipv6):
    108     matchobj = re.match(r'^s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]d|1dd|[1-9]?d)(.(25[0-5]|2[0-4]d|1dd|[1-9]?d)){3}))|:)))(%.+)?s*$',ipv6)
    109     if matchobj:
    110         return True
    111     else:
    112         return False
    113 
    114 ipv62dec('55555:5e:0:0:0:0:0:5668:eeee')
    115 ipv62dec('5555:5e:0:0:0:0:0:5668')
    116 ipv62dec('5555:5e::5668')
    117 ipv62dec('5555:5e::')
    118 ipv62dec('::5555:5e')
    119 ipv62dec('2001:DB8:0:23:8:800:192.168.0.1')
    120 ipv62dec('FFFF::192.168.0.1')
    121 ipv62dec('::192.168.0.1')
    122 ipv62dec('::FFFF:192.168.0.1')

    十进制 转 IPv6:

     1 #!/usr/bin/python
     2 # -*- coding: UTF-8 -*-
     3 
     4 import re
     5 
     6 #将ipv6中段中的0压缩,如005e 压缩为5e
     7 def subZero(ipseg):
     8     index=0
     9     for i in range(len(ipseg)):
    10         if ipseg[i]=='0':
    11             index+=1
    12         else:
    13             break
    14     if index>=2:
    15         return ipseg[index:] if ipseg[index:] else '0'
    16     else:
    17         return ipseg
    18 
    19 #将十进制数转换为ipv6
    20 def dec2ipv6(dec):
    21     if checkdec(dec) and int(dec)<=340282366920938463463374607431768211455:
    22         hexstr=(hex(int(dec)))[2:]
    23         hexstrlen = len(hexstr)
    24         while hexstrlen<32:
    25             hexstr='0'+hexstr
    26             hexstrlen+=1
    27         result=subZero(hexstr[0:4])+":"+subZero(hexstr[4:8])+":"+subZero(hexstr[8:12])+":"+subZero(hexstr[12:16])+":"+subZero(hexstr[16:20])+":"+subZero(hexstr[20:24])+":"+subZero(hexstr[24:28])+":"+subZero(hexstr[28:])
    28         print("result:"+result)
    29         return result
    30     else:
    31         return ""
    32 
    33 #校验十进制数字
    34 def checkdec(dec):
    35     matchobj = re.match(r'(0[dD])?[0-9]+$',dec)
    36     if matchobj:
    37         return True
    38     else:
    39         return False
    40 
    41 
    42 dec2ipv6('340277174624079928635746076938671226881')
    43 dec2ipv6('42540766411282593502542288130627076097')
    44 dec2ipv6('281473913978881')
    45 dec2ipv6('340277174624079928635746076938671226881')
    46 dec2ipv6('113425732322140585886096426104944350824')
  • 相关阅读:
    Java匹马行天下之一顿操作猛如虎,框架作用知多少?
    ztree树应用
    动态将ASPX生成HTML网页并将网页导出PDF
    实现图片向上不停的无限滚动效果简单代码
    简单的前端正则验证用户输入的数字是否合法
    eclipse出现jdk版本更新导致无法启动
    删除所有视图 删除所有存储过程
    删除所有表的数据
    要求必须全部重复的数据sql--想了半天才写出来的
    查询树节点下的所有子节点包括根节点
  • 原文地址:https://www.cnblogs.com/wangjq19920210/p/10393980.html
Copyright © 2011-2022 走看看