【问题标题】:How to turn OpenSSL::ASN1::ASN1Data into IP-address?如何将 OpenSSL::ASN1::ASN1Data 转换为 IP 地址?
【发布时间】:2017-09-29 19:03:41
【问题描述】:

我有一个对象,它会打印到:

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

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

【问题讨论】:

    标签: ruby openssl asn.1


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多