我想知道我的 IP 是给定网络的哪个 N IP。
例如 192.168.0.3 是网络 192.168.0.0/20 的 3 IP。256 IP 将是 192.168.1.0
有没有办法在 python 中快速计算这个?我知道 ipcalc 但没有这样的选项。
我想知道我的 IP 是给定网络的哪个 N IP。
例如 192.168.0.3 是网络 192.168.0.0/20 的 3 IP。256 IP 将是 192.168.1.0
有没有办法在 python 中快速计算这个?我知道 ipcalc 但没有这样的选项。
在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
。
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