2017-05-08 98 views
1

任何人都可以帮助我手动将整数转换为IP地址吗?如何手动将整数转换为Ruby中的IP地址

我理解这个概念,但我正在努力弄清楚这个过程;号码631271850,IP地址为'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 

要反过来做我百思不得其解。我如何将其转换回来?

+1

什么是反斜线做在那里? '2 ** 2'是正确的符号。 – tadman

+1

为什么你不使用现有的类呢? Ruby带有https://ruby-doc.org/stdlib-2.4.1/libdoc/ipaddr/rdoc/index.html,并有https://github.com/dspinhirne/netaddr-rb。 –

+0

Newby在这里,所以请原谅我的错误。 – AshNaz87

回答

5

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

[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 
+0

谢谢!这非常感谢。 – AshNaz87

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地址。

如果你正在编写你自己的,一定要处理那些奇怪的边缘情况。

+1

如果你自己写作,一定要检查现有的,经过充分测试的班级是否已经不需要做什么。 –