V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
bazingaterry
V2EX  ›  问与答

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

  •  
  •   bazingaterry · 2016-07-13 14:15:12 +08:00 · 2034 次点击
    这是一个创建于 2843 天前的主题,其中的信息可能已经有所发展或是发生改变。
    全集是 0.0.0.0/0 ,现在我手头上有某些国家的 IP 段,但问题是如何求出这些 IP 段的补集呢?

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

    谢谢!
    第 1 条附言  ·  2017-11-23 01:13:25 +08:00
    6 条回复    2016-07-14 00:32:33 +08:00
    Blask
        1
    Blask  
       2016-07-13 15:18:06 +08:00
    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  
       2016-07-13 15:19:11 +08:00
    缩进乱了
    Blask
        3
    Blask  
       2016-07-13 15:20:13 +08:00
    看错了 😄
    raptium
        4
    raptium  
       2016-07-13 15:26:23 +08:00
    Java 的话可以用 Guava 的 RangeSet 来做
    把 IP 转为数字,然后从全集里不断扣除就好了
    SoloCompany
        5
    SoloCompany  
       2016-07-14 00:29:39 +08:00
    这不是集合问题啊,算法问题的话或许勉强算得上
    假设无交集的话,可以先排序(按起点 ip )然后一次遍历得到反向区段
    有交集的话,问题就比较复杂了,正确的思路应该是先去掉交集再按上面方法做
    SoloCompany
        6
    SoloCompany  
       2016-07-14 00:32:33 +08:00
    https://github.com/lwr/FloraPacNJS/blob/master/src/flora.js#L226

    这段 js 代码就是对 ip 区间进行排序并且合并相邻区间操作的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5412 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 07:31 · PVG 15:31 · LAX 00:31 · JFK 03:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.