检查IP地址是否在给定范围内

2024-04-29 21:12:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想检查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")

输出:

^{pr2}$

但是,它似乎不能正常工作;在比较77和{}时,问题似乎发生在第三个八位字节中。在

我写了一些印刷体来说明问题所在。在


Tags: or函数inipforreturndefmatch
3条回答

脚本中的错误是-您正在比较字符串,而不是数字。

你可以试试这个:

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"))

当您调用匹配函数时,将传入字符串,这些字符串根据八位字节进行拆分。然而,当进行比较时,被比较的八位字节仍然是一个字符串。因此“7”>;“2”表示第三个八位字节。如果将每个八位字节转换为整数:

if int(ip[i]) < int(min_ip[i]) or int(ip[i]) > int(max_ip[i]):

你会得到预期的反应。

您要比较字符串值(按字典顺序比较),而不是每个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执行两次拆分:

^{pr2}$

如果将forip一起使用,那么for循环可能会更好:

^{3}$

相关问题 更多 >