我想检查IP 180.179.77.11
是否位于特定范围之间,例如180.179.0.0 - 180.179.255.255
。
我编写了一个函数,它将每个IP八位字节与其他八位字节进行比较。
def match(mask, IP):
min_ip = mask.split(' - ')[0].split('.')
max_ip = mask.split(' - ')[1].split('.')
ip = IP.split('.')
for i in range(4):
print ip[i] + " < " + min_ip[i] + " or " + ip[i] + " > " + max_ip[i]
print ip[i] < min_ip[i] or ip[i] > max_ip[i]
if ip[i] < min_ip[i] or ip[i] > max_ip[i]:
return False
return True
match("180.179.0.0 - 180.179.255.255", "180.179.77.11")
输出:
180 < 180 or 180 > 180
False
179 < 179 or 179 > 179
False
77 < 0 or 77 > 255 # 77 > 255 is true
True
False
然而,它似乎没有正常工作;在将77
与255
进行比较时,看起来问题出现在第3个八位字节中。
我已经放了一些印刷语句来说明问题区域。
答案 0 :(得分:2)
您正在比较字符串值(按字典顺序进行比较),而不是每个IP的int
值,请将它们整理为具有理解力的整数:
min_ip = [int(i) for i in mask.split(' - ')[0].split('.')]
max_ip = [int(i) for i in mask.split(' - ')[1].split('.')]
ip = [int(i) for i in IP.split('.')]
如果你不为mask
中的每个ip执行拆分两次,那也是最好的;事先分开:
s = mask.split(' - ')
min_ip, max_ip = [[int(i) for i in j.split('.')] for j in s]
如果您将for
与enumerate
一起使用,那么ip
循环可能会更好:
for ind, val in enumerate(ip):
if val < min_ip[ind] or val > max_ip[ind]:
return False
答案 1 :(得分:1)
当你调用匹配函数时,传入的字符串会根据八位字节进行分割。然而,当进行比较时,被比较的八位字节仍然是一个字符串。因此'7'>第三个八位位组的'2'。如果将每个八位字节转换为整数:
if int(ip[i]) < int(min_ip[i]) or int(ip[i]) > int(max_ip[i]):
您将获得预期的回复。
答案 2 :(得分:0)
你的剧本出了什么问题 - 你正在比较字符串&amp;不是数字。
你可以试试这个:
def match(mask, IP):
min_ip = mask.split(' - ')[0].split('.')
print min_ip
max_ip = mask.split(' - ')[1].split('.')
print max_ip
ip = IP.split('.')
print ip
for i in range(4):
if int(ip[i]) < int(min_ip[i]) or int(ip[i]) > int(max_ip[i]):
return False
return True
print(match("180.179.0.0 - 180.179.255.255", "180.179.77.11"))
答案 3 :(得分:0)
没有循环,希望它有用。
def match(mask, IP):
min_ip = mask.split(' - ')[0].split('.')
max_ip = mask.split(' - ')[1].split('.')
range4 = range(int(min_ip[-2]), int(max_ip[-2]) + 1)
range3 = range(int(min_ip[-1]), int(max_ip[-1]) + 1)
ip = IP.split(".")
if ( (int(ip[-2]) in range3) and (int(ip[-1]) in range4) ):
return True
return False
print match("180.179.0.0 - 180.179.255.255", "180.179.77.11")