需求:给定一个ip:172.28.68.0和一个CIDR格式的ip配置项ipConfig="172.28.64.0/22,172.28.72.11;172.16.0.0/12,172.28.80.27",判断该IP是在哪个cidr表示的地址段,并获取cidr格式后面的一个ip地址。 
    首先,要对cidr表示法要有所了解。 
    例如:172.28.64.0/22表示前22位不变,用1表示,后10位表示网络主机范围,相应的掩码表示为:11111111 11111111 11111100 00000000即该CIDR的掩码为:255.255.252.0 

    然后根据公式计算地址范围: 
   

    • 网络地址 = IP address & Mask     
    • 网络广播地址 = Network address + Mask反码     
    • 地址范围 = { 网络地址, 网络地址 + Mask反码}    

 

方法一:使用IPy库

 

 

[python] view plain copy
 
  1. >>> from IPy import IP  
  2. >>> ip = IP('127.0.0.0/30')  
  3. >>> for x in ip:  
  4. ...     print(x)       ##print前需要有tab空格  
  5. ...                        ##此处回车即可  
  6. 127.0.0.0  
  7. 127.0.0.1  
  8. 127.0.0.2  
  9. 127.0.0.3  

 

方法二:使用netaddr库

 

  • CIDR也能直接转成IP地址段

 

 

[python] view plain copy
 
  1. >>> from netaddr import *  
  2. >>> ip = IPNetwork('192.0.2.16/29')  
  3. >>> ip_list = list(ip)  
  4. >>> print(ip_list)  
  5. [IPAddress('192.0.2.16'), IPAddress('192.0.2.17'), IPAddress('192.0.2.18'), IPAddress('192.0.2.19'), IPAddress('192.0.2.20'), IPAddress('192.0.2.21'), IPAddress('192.0.2.22'), IPAddress('192.0.2.23')]  

 

  • IP段208.130.29.30-35转换成CIDR格式

 

[python] view plain copy
 
  1. >>> from netaddr import *  
  2. >>> startip = '208.130.29.30'  
  3. >>> endip = '208.130.29.35'  
  4. >>> cidrs = netaddr.iprange_to_cidrs(startip, endip)  
  5. >>> for k, v in enumerate(cidrs):  
  6. ...     iplist = v  
  7. ...     print iplist  
  8. ...  
  9. 208.130.29.30/31  
  10. 208.130.29.32/30