gpt4 book ai didi

python - 如何在python中给定起始网络地址获取下一个网络地址

转载 作者:行者123 更新时间:2023-12-01 03:16:10 25 4
gpt4 key购买 nike

Python中有没有一种方法可以从给定的起始网络地址获取下一个网络地址。有多种方法可以使用ipaddress模块获取下一个主机IP,但是有没有办法获取下一个网络本身?

例如,如果我的起始网络地址 10.1.0.0/16,那么在每次迭代中我希望获取下一个网络地址为 10.2.0.0/1610.3.0.0/16 等等。

因此,在 10.1.0.0/16 的情况下,网络部分是前两个八位字节(10.1),其余的是主机部分。我希望网络部分在每次迭代时单独递增,而主机部分保持原样,例如:

start_network = ipaddress.ip_network('10.1.0.0/16')

# Now on each iteration I want the below output

In [37]: next(start_network)
Out[37]: IPv4Network('10.2.0.0/16')
In [38]: next(start_network)
Out[38]: IPv4Network('10.3.0.0/16')

尝试使用子网选项,但顾名思义,它将为您提供当前网络内的子网

In [34]: network = ipaddress.ip_network('10.1.0.0/16')

In [35]: network.subnets()

但是我们的要求是获取下一个网络地址(最好没有任何字符串操作)

最佳答案

图书馆ipcalc有一些例程可以使 IP 地址的数学计算变得相当容易。作为示例,可以使用迭代器来获取下一个网络范围地址:

代码:

import ipcalc
import itertools as it

network = ipcalc.Network('10.1.0.0/16')
network_addrs = (network + (i + 1) * network.size() for i in it.count())

测试代码:

print(next(network_addrs))
print(next(network_addrs))
print(next(network_addrs))

结果:

10.2.0.0/16
10.3.0.0/16
10.4.0.0/16

仅限标准库:

如果最好不要安装ipcalc,则可以构造一个继承自ipaddress.IPv4Network的类。

import ipaddress

class BetterIPv4Network(ipaddress.IPv4Network):

def __add__(self, offset):
"""Add numeric offset to the IP."""
new_base_addr = int(self.network_address) + offset
return self.__class__((new_base_addr, str(self.netmask)))

def size(self):
"""Return network size."""
start = int(self.network_address)
return int(self.broadcast_address) + 1 - start

用法:

import itertools as it

network = BetterIPv4Network(u'10.1.0.0/16')
network_addrs = (network + (i + 1) * network.size() for i in it.count())

Python 3.4:

Python 3.4 不接受元组来初始化ipaddress.IPv4Network。此代码将解决这个问题。

class BetterIPv4Network(ipaddress.IPv4Network):

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.netmask))

def size(self):
"""Return network size."""
start = int(self.network_address)
return int(self.broadcast_address) + 1 - start

关于python - 如何在python中给定起始网络地址获取下一个网络地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42451187/

25 4 0
文章推荐: jquery - MVC jquery 文件上传传递参数
文章推荐: jquery - 页面重新加载后记住 jQuery 选项卡位置
文章推荐: jQuery ('
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com