我有一个对象,它打印成:
#<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('.')
它可以在我的机器上运行,但我想知道,这种方法有多可靠......
答案 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