我已经完成了在python(3.1)中创建一个函数的任务,该函数将采用CIDR表示法并返回可能的ip地址列表.我查看了python.org并发现了这个:http://docs.python.org/dev/py3k/library/ipaddr.html
但我还没有看到任何可以满足这种需求的东西......我会非常感激任何人都愿意帮助我的方式.提前致谢.:-)
如果您没有使用内置模块,那么有一个名为netaddr的项目是我用于处理IP网络的最佳模块.
看看IP教程,它说明了它如何轻松地与网络一起工作并辨别其IP.简单的例子:
>>> from netaddr import IPNetwork >>> for ip in IPNetwork('192.0.2.0/23'): ... print '%s' % ip ... 192.0.2.0 192.0.2.1 192.0.2.2 192.0.2.3 ... 192.0.3.252 192.0.3.253 192.0.3.254 192.0.3.255
在Python 3中就像
>>> import ipaddress >>> [str(ip) for ip in ipaddress.IPv4Network('192.0.2.0/28')] ['192.0.2.0', '192.0.2.1', '192.0.2.2', '192.0.2.3', '192.0.2.4', '192.0.2.5', '192.0.2.6', '192.0.2.7', '192.0.2.8', '192.0.2.9', '192.0.2.10', '192.0.2.11', '192.0.2.12', '192.0.2.13', '192.0.2.14', '192.0.2.15']
我宁愿做一些数学而不是安装一个外部模块,没有人和我有同样的味道?
#!/usr/bin/env python # python cidr.py 192.168.1.1/24 import sys, struct, socket (ip, cidr) = sys.argv[1].split('/') cidr = int(cidr) host_bits = 32 - cidr i = struct.unpack('>I', socket.inet_aton(ip))[0] # note the endianness start = (i >> host_bits) << host_bits # clear the host bits end = start | ((1 << host_bits) - 1) # excludes the first and last address in the subnet for i in range(start, end): print(socket.inet_ntoa(struct.pack('>I',i)))