如何找出哪些地址同时不在 128.0.0.0/1, 64.0.0.0/2, 32.0.0.0/3, 16.0.0.0/4, 0.0.0.0/5, 12.0.0.0/6, 8.0.0.0/7, 11.0.0.0/8 子网中的任意一个中?

2023-01-20 21:14:16 +08:00
 edis0n0
google 了很久也找不到计算方法
2340 次点击
所在节点    宽带症候群
17 条回复
elfive
2023-01-20 21:24:52 +08:00
按位对比就行了呀……
如果 ( IP & Mask ) == (上面列表的 IP & 对应的 Mask )就说明在里面
edis0n0
2023-01-20 21:27:33 +08:00
@elfive 这样一轮下来似乎只能判断一个地址,有没有快速的计算方法?
dzdh
2023-01-20 21:28:12 +08:00
ipv4 地址一共 4,294,967,296 个。你是要同时不满足 cidr 范围的所有 ipv4 地址的一个完整列表么?
edis0n0
2023-01-20 21:31:35 +08:00
@dzdh
leonshaw
2023-01-20 21:52:49 +08:00
区间拆分就行了
eason1874
2023-01-20 21:58:57 +08:00
取相反范围的话,我会简单粗暴的,先合并 cidr ,然后转十进制排除掉,就像从 1-9 排除掉 3-5 得到 1-2 和 6-9
eason1874
2023-01-20 22:00:37 +08:00
#6 说转十进制不太对,应该叫转 long ip
edis0n0
2023-01-20 22:03:57 +08:00
@eason1874 这些 cidr 好像合并不了
eason1874
2023-01-20 22:11:34 +08:00
@edis0n0 那就直接转呗
xupefei
2023-01-20 22:11:53 +08:00
@eason1874 说的对,把开始和结束 ip 转成 int 或 long ,排序后从全局空间里逐个排除。
tril
2023-01-20 22:44:51 +08:00
@edis0n0 “排除指定 IP 段以外的所有 IP 地址段”,如果只需要结果不需要算法的话,这里有个用于计算 wireguard allowedips 的 py 脚本可以做到:
https://www.lautenbacher.io/en/lamp-en/wireguard-exclude-a-single-ip-address/
folnet
2023-01-20 23:03:34 +08:00
python 用 netaddr 进行判断
bao3
2023-01-21 09:15:25 +08:00
你把这些 IP 的掩码转化成二进制,对比二进制就行了
qingcheng
2023-01-21 12:27:40 +08:00
如果要网段或者 IP 少的话逐一比对就可以了,匹配大量 IP 和大量子网的话就用 Trie 吧
ChristianSwift
2023-01-21 21:55:31 +08:00
为什么不问问神奇的 ChatGPT 呢
UnknoownUser
2023-01-23 15:06:56 +08:00
使用 32 个变量的逻辑运算,一位就是一个 x ,把表达式写出来,用二元决策图( BDD )计算
zmcity
2023-01-28 13:49:14 +08:00
开一个 256 长度的 bool 数组查表呗。

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

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

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

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

© 2021 V2EX