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

时间:2017-09-29 19:03:42

标签: ruby openssl asn.1

我有一个对象,它打印成:

   #<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('.')

它可以在我的机器上运行,但我想知道,这种方法有多可靠......

1 个答案:

答案 0 :(得分:0)

好的,正如我在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