【问题标题】:How to manually convert an integer into an IP address in Ruby如何在 Ruby 中手动将整数转换为 IP 地址
【发布时间】:2017-05-08 18:40:56
【问题描述】:

谁能帮助我手动将整数转换为 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

反向操作让我感到困惑。如何转换回来?

【问题讨论】:

标签: arrays ruby ip-address


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    如果您正在编写自己的代码,请务必处理那些奇怪的边缘情况。

    【讨论】:

    • 如果您自己编写,请务必检查现有的、经过充分测试的类是否尚未完成所需的工作。
    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 2013-05-09
    相关资源
    最近更新 更多