给定像192.168.1.0/24
这样的网络定义,我想将/24
的CIDR转换为四位数的网络掩码,在这种情况下是255.255.255.0
。
不能使用额外的宝石。
这里的实际方法非常简单:
def mask(n)
[ ((1 << 32) - 1) << (32 - n) ].pack('N').bytes.join('.')
end
可以得到如下结果:
mask(24)
# => "255.255.255.0"
mask(16)
# => "255.255.0.0"
mask(22)
# => "255.255.252.0"
Ruby的IPAddr
似乎没有公开这个功能。但是,它包含一个名为@mask_addr
的私有实例变量,该变量包含所需掩码的整数值。
可以通过将其转换回另一个IPAddr
实例来表示为四位数的子掩码:
require "ipaddr"
net = IPAddr.new("192.168.1.0/24")
subnet = IPAddr.new(net.instance_variable_get(:@mask_addr), Socket::AF_INET).to_s
# => "255.255.255.0"