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判断生效。
解决方法
你有两种方式实现预期的判断:
使用标准网络地址的CIDR
直接传入20.108.104.0/22,此时库会解析为你预期的完整地址范围,代码无需修改即可得到正确结果。关闭非标准网络地址校验
如果必须保留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
相关产品推荐
相关产品推荐

