IPv4地址上的ruby按位运算

时间:2014-02-15 09:50:56

标签: ruby bit-manipulation

我正在使用IP地址进行一些工作,我想将“斜线符号”(例如/ 28)转换为点分四(例如,255.255.255.240)

将IP和掩码内部表示为大整数,对于不同类型的操作和转换非常方便。

所以我想我会在左边放一个1,向右移动并在斜线上指示另外一个1:

mask=0
28.times do
   mask>>=
   mask+=2**31
end
print "%x\n" % mask

...但由于某些原因,这不起作用。

我听说Ruby会根据需要自动将整数转换为更大的大小。我会在这些例程中做很多按位操作,但有效位数非常稳定。

在Ruby中对IPv4地址执行按位运算的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

>> '%b' % (1 << n)
=> "10000000000000000000000000000"
>> '%b' % ((1 << n) - 1)
=> "1111111111111111111111111111"
>> '%b' % (((1 << n) - 1) << (32-n))
=> "11111111111111111111111111110000"

结合IPAddr

require 'ipaddr'
IPAddr.new(((1 << n) - 1) << (32-n), Socket::AF_INET).to_s
# => "255.255.255.240"

或者正如Arup Rakshit评论的那样,使用IPAddr#mask

IPAddr.new('255.255.255.255').mask(28).to_s
"255.255.255.240"