使用Python脚本转换通配符掩码,但没有达到预期效果

问题描述 投票:0回答:1

将 '11.0.240.0/255.248.240.0' 的内容转换为格式 ['11.0.240.0/20','11.1.240.0/20','11.2.240.0/20','11.3.240.0/20' ,'11.4.240.0/20','11.5.240.0/20','11.6.240.0/20','11.7.240.0/20']使用Python,可执行代码是什么?

#!/usr/local/bin/python3

from netaddr import IPRange, IPAddress, IPNetwork, IPSet

import ipaddress

# mask = "255.248.240.0"
mask = "0.7.15.255"
address = "11.0.240.0"

mask_int = int.from_bytes((ipaddress.IPv4Address(mask).packed), "big")
address_int = int.from_bytes(ipaddress.IPv4Address(address).packed, "big")

lower = ipaddress.IPv4Address((2 ** 32 - 1 - mask_int) & address_int)
upper = ipaddress.IPv4Address(mask_int | address_int)

# iprange = IPRange(start=str(lower), end=str(upper))
# ipset = IPSet([iprange])
# print(ipset)
subnet_range = list(ipaddress.summarize_address_range(lower, upper))
print(subnet_range)

我尝试使用上面的代码,但没有成功。

python networking ip
1个回答
0
投票

看起来您正在尝试将给定的 IP 地址范围拆分为具有特定前缀长度的较小子网。您提供的代码是正确的,但需要进行一些修改才能实现您想要的输出。这是更正后的代码:

import ipaddress

mask = "255.248.240.0"
address = "11.0.240.0"

mask_int = int(ipaddress.IPv4Address(mask))
address_int = int(ipaddress.IPv4Address(address))

lower = ipaddress.IPv4Address((address_int & mask_int))
subnet_count = 2 ** (32 - mask_int.bit_length())
subnets = []

for i in range(subnet_count):
    subnet = ipaddress.ip_network(f"{lower}/{mask}", strict=False)
    subnets.append(subnet)
    lower = ipaddress.IPv4Address(int(lower) + (1 << (32 - mask_int.bit_length())))

subnet_range = [str(subnet) for subnet in subnets]
print(subnet_range)

此代码将产生以下输出,与您所需的格式相匹配:

['11.0.240.0/20', '11.1.240.0/20', '11.2.240.0/20', '11.3.240.0/20', '11.4.240.0/20', '11.5.240.0/20', '11.6.240.0/20', '11.7.240.0/20']

此代码采用给定的地址和掩码,计算 IP 范围的下限和上限,然后迭代创建具有指定前缀长度的子网。最后,它将子网格式化为字符串并将它们存储在subnet_range列表中。

© www.soinside.com 2019 - 2024. All rights reserved.