CIDR
需求:给定一个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库
- >>> from IPy import IP
- >>> ip = IP(\'127.0.0.0/30\')
- >>> for x in ip:
- ... print(x) ##print前需要有tab空格
- ... ##此处回车即可
- 127.0.0.0
- 127.0.0.1
- 127.0.0.2
- 127.0.0.3
方法二:使用netaddr库
- CIDR也能直接转成IP地址段
- >>> from netaddr import *
- >>> ip = IPNetwork(\'192.0.2.16/29\')
- >>> ip_list = list(ip)
- >>> print(ip_list)
- [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格式
- >>> from netaddr import *
- >>> startip = \'208.130.29.30\'
- >>> endip = \'208.130.29.35\'
- >>> cidrs = netaddr.iprange_to_cidrs(startip, endip)
- >>> for k, v in enumerate(cidrs):
- ... iplist = v
- ... print iplist
- ...
- 208.130.29.30/31
- 208.130.29.32/30