如何在Ruby中手动将整数转换为IP地址

时间:2017-05-08 18:40:57

标签: arrays ruby ip-address

有人可以协助我手动将整数转换为IP地址吗?

我理解这个概念,但我正在努力弄清楚这个过程;电话号码631271850,网址是“37 .160.113.170”。

我知道IP地址由四个八位字节组成,我必须手动将IP地址转换为数字的解决方案是:

def ip_to_num(ip_address)
  array = ip_address.split('.').map(&:to_i)
  ((array[0] * 2**24) + (array[1] * 2**16) + (array[2] * 2**8) + (array[3]))
end

反过来让我感到困惑。如何将其转换回来?

2 个答案:

答案 0 :(得分:5)

IP只是一个32位整数,表示一个4字节的数组:

[631271850].pack('N').unpack('CCCC').join('.')
=> "37.160.113.170"

只是为了好玩,另一种将IP转换为int的方法:

"37.160.113.170".split(".").map(&:to_i).pack('CCCC').unpack('N')[0]
=> 631271850

答案 1 :(得分:3)

将IPv4地址转换为数字看似很复杂。参考函数为inet_aton,可正确完成所有转换。您也可以在Ruby中执行此操作以探索不同的格式:

require 'socket'

addrs = %w[
  1.2.3.4
  1.2.3
  1.2
  1
]

addrs.each do |addr|
  puts '%12s -> %08x' % [
    addr,
    Socket.sockaddr_in(0, addr)[4,4].unpack('L>')[0]
  ]
end

这会产生以下输出:

 1.2.3.4 -> 01020304
   1.2.3 -> 01020003
     1.2 -> 01000002
       1 -> 00000001

1.2.31.2的情况可能令人惊讶。最后一个值分别假定为16位值和24位值。但这些都是有效的IPv4地址。

如果你自己编写,请务必处理那些奇怪的边缘情况。