如何使用逻辑或任何内置方法将主机范围的IP从启动IP到结束IP结束IP? Given输入是192.168.3.78/27 输入可以是任何类C IP地址,例如尝试以上IP 预期输出应显示192.168.3.65到192.168.3.94的所有IP 如下 192.1 ...

问题描述 投票:0回答:2
输入可以是任何类C IP地址,以上IP是尝试的,例如

指望的输出应显示从

192.168.3.65

192.168.3.94

的所有IP 如下

192.168.3.65 192.168.3.66 192.168.3.67 ... ... 192.168.3.94

>>> for x in ipaddress.ip_network('192.168.3.78/27'):
     print(x)
Traceback (most recent call last):
  File "<pyshell#31>", line 1, in <module>
    for x in ipaddress.ip_network('192.168.3.78/27'):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python37-32\lib\ipaddress.py", line 74, in ip_network
    return IPv4Network(address, strict)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python37-32\lib\ipaddress.py", line 1536, in __init__
    raise ValueError('%s has host bits set' % self)
ValueError: 192.168.3.78/27 has host bits set

	
接口对象
可以接受任意主机地址并为您提供相应的网络:
python
2个回答
1
投票

恢复: 192.168.3.64 192.168.3.65 ... 192.168.3.94 192.168.3.95


要获得需要使用该选项的预期范围

strict=False
(默认为
True

0
投票

for x in ipaddress.ip_network('192.168.3.78/27', strict=False): print(x) # 192.168.3.64 # 192.168.3.65 # . . . # 192.168.3.95

为什么您出现错误的原因是
192.168.3.78
是主机,而不是CIDR块中的网络(

192.168.3.64/27
将是网络)。
解释

在CIDR符号中,一个代表一个前缀(网络)及其长度(可能从0到32不等)的地址块。如果网络的长度为27,则意味着IP地址块中的每个IP都有27个固定的二进制数字和5(= 32-27)二进制数字,它们在地址末尾可能会有所不同(给出2^5个可能的组合)。

功能函数期望IP地址
ip_network
是一个
network

,在CIDR中,网络是

开始地址

(即设置为0的固定前缀+变量位)。 TIN这种情况网络应将最后5位数字设置为二进制符号中的0位。但事实并非如此,您可以看到二进制符号中的

192.168.3.78

不会以五个0秒结尾

192.168.3.78

这是错误消息的含义。
通过将最后5位数字设置为0,一个获得了预期网络
binary_strings = list(map(lambda x: f"{bin(x)[2:]:0>8}", [192,168,3,78])) print(*binary_strings) # 11000000 10101000 00000011 01001110 %s has host bits set11000000 10101000 00000011 01000000
。实际上,这不会产生错误:

192.168.3.64
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.