如何将 OpenSSL::ASN1::ASN1Data 转换为 IP 地址?

How to turn OpenSSL::ASN1::ASN1Data into IP-address?

我有一个对象,打印到:

   #<OpenSSL::ASN1::ASN1Data:0x0000000803ab37a8
    @infinite_length=false,
    @tag=7,
    @tag_class=:CONTEXT_SPECIFIC,
    @value="\x7F\x00\x00\x01">]>

很容易看出,@value 是一个 IP 地址:127.0.0.1。但是,我如何可靠地提取它 - 以便它在不考虑字节顺序和其他难以测试的考虑因素的情况下工作?

我现在按以下方式进行:

ip = v.value.split('').map {|octet| octet.ord }.join('.')

它在我的机器上有效,但我想知道,该方法的可靠性如何...

好的,正如我在 related question 中报告的那样,我在 Ruby 自己的代码 (openssl/ssl.rb) 中找到了答案。因此,它们同时处理 IPv4 和 IPv6 地址——使用 unpack 而不是 split 将字符串转换为字符:

        case v.value.size
        when 4
            ip = v.value.unpack('C*').join('.')
        when 16
            ip = v.value.unpack('n*').map { |o| sprintf("%X", o) }.join(':')
        else
            STDERR.print "The encountered IP-address is neither IPv4 nor IPv6\n"
            next
        end