如何从当前网络地址递增并获取下一个 IPv6 网络地址
How to increment and get the next IPv6 network address from the current network address
使用标准 python 包,如果我们将任何 IPv6 网络地址作为输入,我如何才能获得下几个 IPv6 网络地址。基本上我想遍历给定的网络地址,并且在每次迭代中它应该递增并获得下一个网络
例如,如果我的起始网络地址为 4001:1::/32,那么在每次迭代中我希望获得下一个网络地址 4001:2::/32,4001:3::/32、4001:4::/32 等等。
>>> inet = iterate_on('4001:1::/32')
>>> next(inet)
4001:2::/32
>>> next(inet)
4001:3::/32
注意:这是我之前针对 的问题。
库 ipcalc 具有使 ip 地址的数学计算相当容易的例程。但是如果不安装ipcalc会更好,可以构造一个继承自ipaddress.IPv6Network的class
代码
import ipaddress
class BetterIPv6Network(ipaddress.IPv6Network):
def __add__(self, offset):
"""Add numeric offset to the IP."""
new_base_addr = int(self.network_address) + offset
return self.__class__((new_base_addr, self.prefixlen))
def size(self):
"""Return network size."""
return 1 << (self.max_prefixlen - self.prefixlen)
测试代码:
import itertools as it
network = BetterIPv6Network(u'4001:1::/32')
network_addrs = (network + i * network.size() for i in it.count())
print(next(network_addrs))
print(next(network_addrs))
print(next(network_addrs))
结果:
4001:1::/32
4001:2::/32
4001:3::/32
Python 3.4:
Python 3.4 不接受元组来初始化 ipaddress.IPv6Network。此代码将解决此问题。
import ipaddress
class BetterIPv6Network(ipaddress.IPv6Network):
def __add__(self, offset):
"""Add numeric offset to the IP."""
new_base_addr = int(self.network_address) + offset
new_base_addr_str = str(self.__class__(new_base_addr)).split('/')[0]
return self.__class__(
new_base_addr_str + '/' + str(self).split('/')[1])
def size(self):
"""Return network size."""
return 1 << (self.max_prefixlen - self.prefixlen)
使用标准 python 包,如果我们将任何 IPv6 网络地址作为输入,我如何才能获得下几个 IPv6 网络地址。基本上我想遍历给定的网络地址,并且在每次迭代中它应该递增并获得下一个网络
例如,如果我的起始网络地址为 4001:1::/32,那么在每次迭代中我希望获得下一个网络地址 4001:2::/32,4001:3::/32、4001:4::/32 等等。
>>> inet = iterate_on('4001:1::/32')
>>> next(inet)
4001:2::/32
>>> next(inet)
4001:3::/32
注意:这是我之前针对
库 ipcalc 具有使 ip 地址的数学计算相当容易的例程。但是如果不安装ipcalc会更好,可以构造一个继承自ipaddress.IPv6Network的class
代码
import ipaddress
class BetterIPv6Network(ipaddress.IPv6Network):
def __add__(self, offset):
"""Add numeric offset to the IP."""
new_base_addr = int(self.network_address) + offset
return self.__class__((new_base_addr, self.prefixlen))
def size(self):
"""Return network size."""
return 1 << (self.max_prefixlen - self.prefixlen)
测试代码:
import itertools as it
network = BetterIPv6Network(u'4001:1::/32')
network_addrs = (network + i * network.size() for i in it.count())
print(next(network_addrs))
print(next(network_addrs))
print(next(network_addrs))
结果:
4001:1::/32
4001:2::/32
4001:3::/32
Python 3.4:
Python 3.4 不接受元组来初始化 ipaddress.IPv6Network。此代码将解决此问题。
import ipaddress
class BetterIPv6Network(ipaddress.IPv6Network):
def __add__(self, offset):
"""Add numeric offset to the IP."""
new_base_addr = int(self.network_address) + offset
new_base_addr_str = str(self.__class__(new_base_addr)).split('/')[0]
return self.__class__(
new_base_addr_str + '/' + str(self).split('/')[1])
def size(self):
"""Return network size."""
return 1 << (self.max_prefixlen - self.prefixlen)