如何在 Ruby 中手动将整数转换为 IP 地址
How to manually convert an integer into an IP address in 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
相反的做法让我很困惑。我如何将其转换回来?
将 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 地址。
如果您自己编写,请务必处理那些奇怪的边缘情况。
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
谁能帮我手动将整数转换成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
相反的做法让我很困惑。我如何将其转换回来?
将 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 地址。
如果您自己编写,请务必处理那些奇怪的边缘情况。
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