Python实现IP地址包含关系判断与转换方法

Oliver
Oliver
发布时间:2026-10-13 | 6人浏览过
原创

本文介绍如何利用Python实现IP地址的包含关系判断。通过自定义函数将不同格式的IP地址(如标准IP、范围IP、CIDR等)统一转换为十进制数值范围,进而通过数值比较判断两个IP地址之间是否存在包含关系,解决了标准库在某些场景下的局限性。

IP地址判断面临的挑战

虽然Python的IPy模块能够处理部分IP地址判断任务,但其功能并不完善,在某些特定场景下无法给出正确结果甚至抛出异常。例如,当需要判断一个IP地址范围与一个IP/掩码格式之间的包含关系时,由于类型不一致,该模块往往无法直接处理。

基于十进制转换的实现思路

针对上述问题,可以通过编写自定义函数来实现IP地址的判断功能。核心思路是将各种格式的IP地址统一转换为十进制数值范围,随后通过比较这些数值范围来确定是否存在包含关系。

核心代码实现


#下面函数可以将ip转换为十进制数
def iptoint(self,ip):
  try:
    h=[]
    s = ip.split('.')
    for temp in s:
      a=bin(int(temp))[2:]
      a=a.zfill(8)
      h.append(a)
    g=''.join(h)
    e=int(g,2)
  except:
    print('错误:不支持该ip的转换' + ip + '\n')
    traceback.print_exc(file=open('exception.log', 'a+')) # 输出异常信息到文件
  return e
  
  #下面函数可以将各种类型的地址进行处理后进行转换为十进制数

  def get_ipint(self,ip):
    try:
      if re.fullmatch('\d+.\d+.\d+.\d+',ip):
        ipint1=self.iptoint(self,ip)
        ipint2=self.iptoint(self,ip)
      elif re.fullmatch('\d+.\d+.\d+.\d+-\d+.\d+.\d+.\d+',ip):
        ipint1=self.iptoint(self,ip.split('-')[0])
        ipint2=self.iptoint(self,ip.split('-')[1])
      elif re.fullmatch('\d+.\d+.\d+.\d+/32',ip):
        ipint1 = self.iptoint(self, ip.split('/')[0])
        ipint2 = ipint1
      elif re.fullmatch('\d+.\d+.\d+.\d+/\d+',ip):
        ipint1 = self.iptoint(self, ip.split('/')[0])
        ipint2 = ipint1+int(math.pow(2,32-int(ip.split('/')[1])))-1
      elif re.fullmatch('\d+.\d+.\d+.\d+/\d+.\d+.\d+.\d+',ip):
        ipint1 = self.iptoint(self, ip.split('/')[0])
        ipint2 = ipint1+int(math.pow(2,32-int(self.exchange_mask(ip.split('/')[1]))))-1
      else:
        ipint1=0
        ipint2=0
      return ipint1,ipint2
    except:
      traceback.print_exc(file=open('exception.log','a+'))#输出异常信息到文件
      print('错误:ip转换失败' + ip + '\n')

  
  #下面的函数可以对十进制数进行包含关系判断
  def ip_compare(self,ipa,ipb):
    try:
      ipa1,ipa2=self.get_ipint(ipa)
      ipb1,ipb2 = self.get_ipint(ipb)
      if ipa1<=ipb1<=ipa2 or ipa1<=ipb2<=ipa2 or ipb1<=ipa1<=ipb2 or ipb1<=ipa2<=ipb2:
        isinclude=True
      else:
        isinclude = False
      return isinclude
    except:
      self.m_textCtrl3.AppendText('错误:ip对比失败' + ipa+'-'+ipb + '\n')
      traceback.print_exc(file=open('exception.log', 'a+')) # 输出异常信息到文件

方法效果总结

利用上述转换与判断方法,可以全面解决各种类型IP地址之间的包含关系判断问题,确保在不同格式混合场景下也能准确得出结果。

总结

总结

结语

以上介绍了使用Python实现IP地址包含关系判断的方法,希望能为相关开发工作提供帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表