【发布时间】:2013-09-01 00:57:02
【问题描述】:
我想知道我的IP是给定网络的哪个N IP。
例如 192.168.0.3 是网络 192.168.0.0/20 的 3 IP。 256 IP 将是 192.168.1.0
有没有办法在 python 中快速计算这个?我知道 ipcalc 但没有这样的选项。
【问题讨论】:
标签: python networking ip
我想知道我的IP是给定网络的哪个N IP。
例如 192.168.0.3 是网络 192.168.0.0/20 的 3 IP。 256 IP 将是 192.168.1.0
有没有办法在 python 中快速计算这个?我知道 ipcalc 但没有这样的选项。
【问题讨论】:
标签: python networking ip
在标准库的ipaddress 模块中,网络对象可以用作地址的可迭代对象。所以,这只是一个序列中的正常发现:
>>> import ipaddress
>>> addr = ipaddress.ip_address('192.168.0.1')
>>> net = ipaddress.ip_network('192.168.0.0/20')
>>> net[256]
IPv4Address('192.168.1.0')
>>> next(i for i, a in enumerate(net) if a == addr)
3
更多解释请参见HOWTO。
请注意,这适用于整数形式的地址以及点分字符串、IPv6 和 IPv4 等。
如果您使用的是 Python 2.x,则需要 backport on PyPI。如果您使用的是 3.0-3.2,我相信 backport 还不支持这些,在这种情况下,最好的办法是使用它所基于的库 ipaddr。
【讨论】:
reduce(lambda x,y: (int(x)*256)+int(y), IP.split('.')[2:])
>>> IP = "192.168.0.3"
>>> reduce(lambda x,y: (int(x)*256)+int(y), IP.split('.')[2:])
3
>>> IP = "192.168.1.0"
>>> reduce(lambda x,y: (int(x)*256)+int(y), IP.split('.')[2:])
256
正如@Blake 指出的那样,您可以通过添加参数使其更加通用:
def versatileCount(IP, b):
return reduce(lambda x,y: (int(x)*256)+int(y), IP.split('.')[-b:])
>>> def versatileCount(IP, b):
... if not 1 <= b <= 4:
... raise ValueError("b has to be between 1 and 4")
... return reduce(lambda x,y: (int(x)*256)+int(y), IP.split('.')[-b:])
...
>>> versatileCount(IP,2)
256
>>> IP = "192.168.0.3"
>>> versatileCount(IP,2)
3
【讨论】: