bazingaterry
V2EX  ›  问与答

请教一个取 CIDR IP 集合的补集最快捷的方法

  •  
  •   bazingaterry · Jul 13, 2016 · 2614 views
    This topic created in 3618 days ago, the information mentioned may be changed or developed.
    全集是 0.0.0.0/0 ,现在我手头上有某些国家的 IP 段,但问题是如何求出这些 IP 段的补集呢?

    V2EX 之前有一篇帖子有讨论,但是没有了下文,所以再次来求教。

    谢谢!
    6 replies    2016-07-14 00:32:33 +08:00
    Blask
        1
    Blask  
       Jul 13, 2016
    import ipaddress
    import sys
    f=open('1','r')
    while(1):
    line=f.readline()
    if not line:
    break
    print(ipaddress.ip_network(line.strip()).hostmask)
    Blask
        2
    Blask  
       Jul 13, 2016
    缩进乱了
    Blask
        3
    Blask  
       Jul 13, 2016
    看错了 😄
    raptium
        4
    raptium  
       Jul 13, 2016
    Java 的话可以用 Guava 的 RangeSet 来做
    把 IP 转为数字,然后从全集里不断扣除就好了
    SoloCompany
        5
    SoloCompany  
       Jul 14, 2016
    这不是集合问题啊,算法问题的话或许勉强算得上
    假设无交集的话,可以先排序(按起点 ip )然后一次遍历得到反向区段
    有交集的话,问题就比较复杂了,正确的思路应该是先去掉交集再按上面方法做
    SoloCompany
        6
    SoloCompany  
       Jul 14, 2016
    https://github.com/lwr/FloraPacNJS/blob/master/src/flora.js#L226

    这段 js 代码就是对 ip 区间进行排序并且合并相邻区间操作的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5649 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 03:37 · PVG 11:37 · LAX 20:37 · JFK 23:37
    ♥ Do have faith in what you're doing.