看不懂 CIDR 格式, PHP 怎么判断某个 IP 属于下列这个范围?

2019-07-09 22:12:36 +08:00
 yibeishui
电信 IP 段: https://ispip.clang.cn/chinatelecom_cidr.txt
5906 次点击
所在节点    DNS
5 条回复
THaGKI9
2019-07-09 22:23:12 +08:00
CIDR 格式斜杠后面的数字表示子网掩码的长度
比如 255.255.255.0/24
子网掩码长度为 24,表示这个网段的 IP 前 24 位是斜杠前面 IP 的前 24 位,也就是 255.255.255.x
对应网段 255.255.255.0 ~ 255.255.255.255
lcdtyph
2019-07-09 22:28:18 +08:00
假设有一条 cidr 记录是 a.b.c.d/m
那么如果有个 ip 的前 m 位和 a.b.c.d 的前 m 位一样,这个 ip 就属于这个 cidr 记录表示的网段了

快速匹配的话可以用字典树,不清楚 php 有没有现成的轮子。或者其他的路由表查找算法都可以用在这里
zbinlin
2019-07-09 22:30:09 +08:00
将 ip 转成整数( A ),2 ** (32 - 掩码长度) 为有效数量( n )。这样判断一个 IP 时,将 IP 转成整数( B),然后判断是否:A >= B < A + n 成立。
txydhr
2019-07-10 05:43:46 +08:00
子网掩码的另一种写法
lihongjie0209
2019-07-10 10:09:30 +08:00
简单粗暴一点直接枚举所有就可以了

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

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

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

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

© 2021 V2EX