x89*_*899 5 python ip-address python-2.7 python-3.x
我想检查 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")
Run Code Online (Sandbox Code Playgroud)
输出:
180 < 180 or 180 > 180
False
179 < 179 or 179 > 179
False
77 < 0 or 77 > 255 # 77 > 255 is true
True
False
Run Code Online (Sandbox Code Playgroud)
然而,它似乎不能正常工作;77与进行比较时,问题似乎出现在第 3 个八位字节中255。
我已经放置了一些打印语句来说明问题区域。
您正在比较字符串值(按字典顺序比较)而不是int每个 IP 的值,将它们转换为带有推导式的整数:
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('.')]
Run Code Online (Sandbox Code Playgroud)
最好不要对 中的每个 ip 执行两次拆分mask;事先分开:
s = mask.split(' - ')
min_ip, max_ip = [[int(i) for i in j.split('.')] for j in s]
Run Code Online (Sandbox Code Playgroud)
如果您使用with ,您的for循环可能会更好:enumerateip
for ind, val in enumerate(ip):
if val < min_ip[ind] or val > max_ip[ind]:
return False
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3593 次 |
| 最近记录: |