如何将 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
我有一个对象,打印到:
#<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