1 回答

TA貢獻1793條經驗 獲得超6個贊
如果iprange_to_cidrs始終返回跨越提供的范圍所需的最小 IP 范圍數(看起來很可能),那么您只需要測試它返回的列表的長度。
但是,如果您不想驗證情況是否始終如此,可以使用以下方法。
def ip_to_int(ip):
return sum(256**i * int(v) for i, v in enumerate(reversed(ip.split('.'))))
def single_cidr(ip1, ip2):
n1 = ip_to_int(ip1)
n2 = ip_to_int(ip2)
xor = n2 ^ n1
return xor == abs(n2 - n1) and '0' not in bin(xor)[2:]
print(single_cidr('13.108.0.0', '13.111.255.255')) # True
print(single_cidr('13.108.0.0', '13.211.255.255')) # False
這里,xor兩個 IP(轉換為整數時)不同的每一位都包含 1。我們希望這個數字等于兩個值之間的差值,并且比 2 的冪小 1,這樣二進制中的兩個 IP 地址都以相同的詞干開頭,然后一個全 0,另一個全 1。
在這部分中,'0' not in bin(xor)[2:]我們使用了這樣一個事實,即bin初始值之后的輸出0b將從第一個 1 位開始,而不填充任何前導零(例如,對于 65535 ,它將是'0b11111111'),因此我們只需要測試初始值之后沒有 0 0b。
添加回答
舉報