You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sean Foley IPAddress库IP地址与CIDR包含判断异常问题

问题原因与解决方案

核心逻辑

IPAddress库对CIDR的解析默认会严格校验网络地址的有效性:只有当CIDR中的地址是对应前缀长度下的标准网络地址时,才会解析为该前缀覆盖的完整地址范围。

  • 对于20.108.106.0/22:/22前缀要求前22位固定,计算第三个octet可知,该前缀的标准网络地址是20.108.104.0(106的二进制为01101010,前6位对应十进制104)。你传入的20.108.106.0并非该前缀的标准网络地址,因此库不会将其解析为完整的20.108.104.0~20.108.107.255范围,而是将其视为一个受限的主机范围,导致contains判断返回false。
  • 对于20.108.106.0/23:/23前缀要求前23位固定,106的二进制最后一位为0,刚好符合网络地址的要求(主机位全0),因此库正常解析为完整范围,contains判断生效。

解决方法

你有两种方式实现预期的判断:

  1. 使用标准网络地址的CIDR
    直接传入20.108.104.0/22,此时库会解析为你预期的完整地址范围,代码无需修改即可得到正确结果。

  2. 关闭非标准网络地址校验
    如果必须保留20.108.106.0/22的输入格式,可以通过IPAddressStringParameters关闭网络地址有效性检查,让库自动将其修正为对应前缀的完整范围:

    @Test
    fun testCidr() {
        val params = IPAddressStringParameters.Builder().allowNonStandardNetwork(true).build()
        val cidr = IPAddressString("20.108.106.0/22", params).getAddress()
        val ip = IPAddressString("20.108.106.72").getAddress()
        println("$ip is inside $cidr = ${cidr.contains(ip)}")
    }
    

    运行后会输出20.108.106.72 is inside 20.108.104.0/22 = true,符合预期。

内容的提问来源于stack exchange,提问作者tubbs_uk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:06:28