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

2016-07-13 14:15:12 +08:00
 bazingaterry
全集是 0.0.0.0/0 ,现在我手头上有某些国家的 IP 段,但问题是如何求出这些 IP 段的补集呢?

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

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

这段 js 代码就是对 ip 区间进行排序并且合并相邻区间操作的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/292220

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX