1

我想知道我的 IP 是给定网络的哪个 N IP。

例如 192.168.0.3 是网络 192.168.0.0/20 的 3 IP。256 IP 将是 192.168.1.0

有没有办法在 python 中快速计算这个?我知道 ipcalc 但没有这样的选项。

4

2 回答 2

4

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,则需要PyPI 上的 backport。如果您使用的是 3.0-3.2,我相信 backport 还不支持这些,在这种情况下,最好的选择是使用它所基于的库ipaddr

于 2013-08-28T19:40:17.363 回答
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
于 2013-08-28T19:30:43.473 回答