【发布时间】:2021-03-26 19:43:20
【问题描述】:
我被要求做一个应用程序来为子网提供可能的主机总数,遗憾的是我不能使用 Python 提供的ipaddress 模块,所以我需要编写自己的方法来检查和验证输入的数据
我的代码是这样的:
def IP_Validation(chk_IP_vaild):
if chk_IP_vaild.count(".") == 3 and all(isIP(i) for i in chk_IP_vaild.split(".")):
return True
return False
def isIP(IP_String):
try:
return str(int(IP_String)) == IP_String and 0 <= int(IP_String) <= 255
except:
return False
def Calc_Networks(IP_One , IP_Two):
if IP_Validation(IP_One) and IP_Validation(IP_Two):
print (IP_One,IP_Two)
else:
print ("There is an error")
Calc_Networks("172.11.254.1", "172.1.254.")
Calc_Networks("172.11.254.1", "172.1.254.0")
输出
There is an error
172.11.254.1 172.1.254.0
但这只会检查输入的 IP 是否为 IPv4,所以我在互联网上搜索和检查解决方案时遇到了这个问题:
import ipaddress
def calc_inclusive_subnet(ip1, ip2): #accepts 2 IP strings
#make IP Address objects
ip1_obj=ipaddress.IPv4Address(ip1)
ip2_obj=ipaddress.IPv4Address(ip2)
if ip1_obj<=ip2_obj:
min_ip=ip1_obj
max_ip=ip2_obj
else:
min_ip=ip2_obj
max_ip=ip1_obj
distance = int(max_ip)-int(min_ip) #**
return distance
print (calc_inclusive_subnet("192.168.1.0", "192.168.2.255"))
输出
511
我注意到,如果我对使用 ipaddress 模块声明的两个 IP 进行减法处理,它会毫无问题地正确完成,所以我去了 Docs 以了解该模块如何处理 IP,以便我可以使用类似的方法
使用 code 1 进行减法会出现以下错误:
def Calc_Networks(IP_One , IP_Two):
if IP_Validation(IP_One) and IP_Validation(IP_Two):
dis = int(IP_Two) - int(IP_One)
return dis
输出是:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-154-9e53188ce6f1> in <module>
16
17
---> 18 print(Calc_Networks("172.11.254.1", "172.1.254.1"))
19 Calc_Networks("172.11.254.1", "172.1.254.")
<ipython-input-154-9e53188ce6f1> in Calc_Networks(IP_One, IP_Two)
12 def Calc_Networks(IP_One , IP_Two):
13 if IP_Validation(IP_One) and IP_Validation(IP_Two):
---> 14 dis = int(IP_Two) - int(IP_One)
15 return dis
16
ValueError: invalid literal for int() with base 10: '172.1.254.1'
【问题讨论】: