计算网络的N IP

时间:2013-08-28 19:25:50

标签: 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但是没有这样的选择。

2 个答案:

答案 0 :(得分:4)

在标准库的ipaddress模块中,Network对象可以用作地址的可迭代。所以,这只是序列中的正常查找:

>>> 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的库。

答案 1 :(得分:1)

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