1 回答

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果iprange_to_cidrs始終返回跨越提供的范圍所需的最小 IP 范圍數(shù)(看起來(lái)很可能),那么您只需要測(cè)試它返回的列表的長(zhǎng)度。
但是,如果您不想驗(yàn)證情況是否始終如此,可以使用以下方法。
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兩個(gè) IP(轉(zhuǎn)換為整數(shù)時(shí))不同的每一位都包含 1。我們希望這個(gè)數(shù)字等于兩個(gè)值之間的差值,并且比 2 的冪小 1,這樣二進(jìn)制中的兩個(gè) IP 地址都以相同的詞干開(kāi)頭,然后一個(gè)全 0,另一個(gè)全 1。
在這部分中,'0' not in bin(xor)[2:]我們使用了這樣一個(gè)事實(shí),即bin初始值之后的輸出0b將從第一個(gè) 1 位開(kāi)始,而不填充任何前導(dǎo)零(例如,對(duì)于 65535 ,它將是'0b11111111'),因此我們只需要測(cè)試初始值之后沒(méi)有 0 0b。
添加回答
舉報(bào)