如何手动将整数转换为Ruby中的IP地址
任何人都可以帮助我手动将整数转换为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
要反过来做我百思不得其解。我如何将其转换回来?
的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
谢谢!这非常感谢。 – AshNaz87
将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.3
和1.2
的案例或许不足为奇。假定最后的值分别是16位值和24位值。不过,这些都是有效的IPv4地址。
如果你正在编写你自己的,一定要处理那些奇怪的边缘情况。
如果你自己写作,一定要检查现有的,经过充分测试的班级是否已经不需要做什么。 –
什么是反斜线做在那里? '2 ** 2'是正确的符号。 – tadman
为什么你不使用现有的类呢? Ruby带有https://ruby-doc.org/stdlib-2.4.1/libdoc/ipaddr/rdoc/index.html,并有https://github.com/dspinhirne/netaddr-rb。 –
Newby在这里,所以请原谅我的错误。 – AshNaz87