3

Ruby 2.0.0 を使用して、どのように型のオブジェクトを型に変換できますIPAddrNetAddr::CIDR?

例:

IPAddr.new("1a03:a240:0100::/56")
IPAddr.new("192.1268.1.0/24")

netmask/ プレフィックスを尊重しないため、これは機能しません。

NetAddr::CIDR.create(IPAddr.new("1a03:a240:0100::/56").to_s).to_s
=> "1a03:a240:0100:0000:0000:0000:0000:0000/128"
4

2 に答える 2

5

Discourseで使用する別のソリューションを次に示します。

class IPAddr

  def to_cidr_s
    if @addr
      mask = @mask_addr.to_s(2).count('1')
      "#{to_s}/#{mask}"
    else
      nil
    end
  end

end
于 2014-11-21T17:25:57.913 に答える
2

現在のクラスを拡張する必要がありますIPAddr(少なくとも 2.0.0 では)。ruby ではクラスを再度開くだけでクラスを拡張できるため、プレフィックスを計算して表示するために必要なすべてのインスタンス変数にアクセスできます。

class IPAddr
  def prefix
    begin_addr = (@addr & @mask_addr)

    case @family
      when Socket::AF_INET
        end_addr = (@addr | (IN4MASK ^ @mask_addr))
      when Socket::AF_INET6
        end_addr = (@addr | (IN6MASK ^ @mask_addr))
      end

    32 - Math.log(end_addr - begin_addr + 1, 2).to_i
  end

  def to_cidr_s
    to_s + "/#{prefix}"
  end
end

上記の抜粋の一部は から取得されIPAddr#to_rangeます。

于 2014-06-17T08:24:11.757 に答える