1、掩码校验 我在了解了子网掩码的概念后,感觉最难的反而是子网掩码的判断上面 11111111 11111111 11111111 10000000#这个也是子网掩码 11111111 11111111 11111111 10100000#这个就不是子网掩码 因为101中间有个0,不满足他说的前缀都是1,这种情况 于是我的思路就是把所有已知情况都列出来 ymlst=["11111111","11111110","11111100","11111000","11110000","11100000","11000000","10000000","00000000"] 掩码在满足这个ip的情况下,1的还得递减,毕竟255.0.255.0这种就是不满足的
2、掩码运算 然后与计算经过测试发现完全可以用数字进行运算,比如192&255=192他是能算出来的。
3、ip校验 除了满足0-255之外,还要考虑一种情况,192.168.01.01#这种01的应该也是不行的,所以要加一个不能startwith(0)来校验
之后就简单了,代码如下:
``` python []
#写个判断if是否合法的函数吧
def iphf(lst):
tmp=3#区分1和2
if len(lst)<4:#判断是否是4个
tmp=0
for i in lst:#判断ip是否合理
if int(i)>255 or int(i)<0 or (len(i)>1 and i.startswith('0')):#第三个or是考虑01.02这种情况的
tmp=1#非法输入
return(tmp)
#写个字符串数字转换成2进制的函数:
def strtobin(s):
tmp=bin(int(s))[2:].rjust(8,"0")#直接int(s)就行了
return tmp
#将ip和掩码带入进行演算
def zwys(ip,ym):
tmp=[]
for i in range(4):#已经通过条件了,所以直接运算
a=int(ip[i])&int(ym[i])#直接转换成int类型,与就可以了,测试出来的
#print(a)#测试用
tmp.append(a)
return tmp
while True:
try:
flag=[]#定义一个flag数组吧,到时候全加到里面去
#1、先判断是否非法
#输入的是掩码
ym=list(map(str,input().split(".")))
IP1=list(map(str,input().split(".")))
IP2=list(map(str, input().split(".")))
flag.append(iphf(IP1))#判断ip是否合法
flag.append(iphf(IP2))
#判断子网掩码是否合法
tmpym=[]
ymlst=["11111111","11111110","11111100","11111000","11110000","11100000","11000000","10000000","00000000"]
if iphf(ym)!=1:#首先需要满足正常ip属性
tmplen=8#用来记录值,以达到一个递减的效果,最大值为8
for i in ym:
tmpym.append(strtobin(i))
for i in tmpym:
if str(i) in ymlst:#如果在这个里面
f=tmplen-str(i).count("1")#如果满足1递减的话
tmplen=str(i).count("1")
#print(tmplen)#测试用。满足条件
if f>=0:
continue
else:
flag.append(1)
else:
flag.append(1)
else:
flag.append(1)
#print(tmpym)#测试用
#print(flag)#测试用,满足条件
#print(zwys(IP1,ym))#测试用
#2、算子网掩码并比较
ymip1=zwys(IP1,ym)#算第一个子网掩码
ymip2=zwys(IP2,ym)#算第二个子网掩码
#print(ymip1,ymip2)#测试用
if 1 not in flag:
for i in range(4):
if ymip1[i]==ymip2[i]:
flag.append(0)
else:
flag.append(2)
#print(flag)
#最后就是一个flag判断的问题了
if 1 in flag:
print(1)
elif 2 in flag:
print(2)
else:
print(0)
except:
break