我正在使用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地址执行按位运算的正确方法是什么?
答案 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"