亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何檢查給定的IP地址范圍只包含一個CIDR?

如何檢查給定的IP地址范圍只包含一個CIDR?

幕布斯6054654 2023-07-11 15:29:29
我試圖編寫一個Python腳本將兩個IP地址之間的范圍轉換為CIDR,# cidr.pyimport argparseimport netaddrimport sysparser = argparse.ArgumentParser()parser.add_argument('start_addr')parser.add_argument('end_addr')args = parser.parse_args()start_addr = netaddr.IPAddress(args.start_addr)end_addr = netaddr.IPAddress(args.end_addr)if end_addr < start_addr:  print('start address is larger than end address. check arguments.')  sys.exit()ip_cidr = netaddr.iprange_to_cidrs(start_addr, end_addr)print(str(ip_cidr))例如,使用Salesforce 的 IP 地址范圍作為參數執行此腳本,它會返回正確的 CIDR 表達式。$ python cidr.py 13.108.0.0 13.111.255.255[IPNetwork('13.108.0.0/14')]但是當我修改第二個參數時,它會返回幾個 CIDR。$ python hoge.py 13.108.0.0 13.211.255.255[IPNetwork('13.108.0.0/14'), IPNetwork('13.112.0.0/12'), IPNetwork('13.128.0.0/10'), IPNetwork('13.192.0.0/12'), IPNetwork('13.208.0.0/14')]我想知道2個IP地址的地址范圍只包含1個CIDR表達式。我該如何檢查?
查看完整描述

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。


查看完整回答
反對 回復 2023-07-11
  • 1 回答
  • 0 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號