当前位置:  开发笔记 > 后端 > 正文

Ruby IPAddr:查找地址掩码

如何解决《RubyIPAddr:查找地址掩码》经验,为你挑选了1个好方法。

我有一个应用程序,我处理大量的IP地址(分析检查点防火墙规则集).有一次,我想检查特定地址对象是/ 32还是"网络".

目前我这样做:

next unless ip.inspect.match(/\/255\.255\.255\.255/)

它工作但似乎有点低效,但我看不到任何从地址对象中提取掩码的方法.



1> tadman..:

Ruby核心库的某些部分有时只是勾勒出来的,而IPAddr似乎是其中之一,遗憾的是,它有点不完整.

不用担心.你可以用一个简单的猴子补丁解决这个问题:

class IPAddr
  def cidr_mask
    case (@family)
    when Socket::AF_INET
      32 - Math.log2((1<<32) - @mask_addr).to_i
    when Socket::AF_INET6
      128 - Math.log2((1<<128) - @mask_addr).to_i
    else
      raise AddressFamilyError, "unsupported address family"
    end
  end
end

这应该处理IPv4和IPv6地址:

IPAddr.new('151.101.65.69').cidr_mask
# => 32

IPAddr.new('151.101.65.69/26').cidr_mask
# => 26

IPAddr.new('151.101.65.69/255.255.255.0').cidr_mask
# => 24

IPAddr.new('2607:f8b0:4006:800::200e').cidr_mask
# => 128

IPAddr.new('2607:f8b0:4006:800::200e/100').cidr_mask
# => 100

这不一定是最好的解决方案,但它确实有效.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有