本文简要介绍ruby语言中  OpenSSL::ASN1::ASN1Data类  的用法。
代表任何 ASN.1 对象的顶级类。当由  ASN1.decode  解析时,标记值始终由  ASN1Data  的实例表示。
 ASN1Data  用于解析标记值的作用
在对 ASN.1 类型进行编码时,无论其标记如何,本质上都清楚该值具有什么原始类型(例如 INTEGER、OCTET STRING 等)。但与编码 ASN.1 类型的时间相反,在解析它们时,不可能推断出标记值的 “real type”。这就是为什么标记值通常被解析为  ASN1Data  实例,但隐式和显式标记的结果不同。
已解析的隐式标记值示例
隐含 1 标记的 INTEGER 值将被解析为  ASN1Data 
- 
tag等于 1
- 
tag_class等于:CONTEXT_SPECIFIC
- 
value等于String,它携带 INTEGER 的原始编码。
这意味着需要后续的解码步骤来完全解码隐式标记的值。
已解析的显式标记值示例
显式 1 标记的 INTEGER 值将被解析为  ASN1Data 
- 
tag等于 1
- 
tag_class等于:CONTEXT_SPECIFIC
- 
value等于带有单个元素的Array,是OpenSSL::ASN1::Integer的一个实例,即内部元素是未标记的原始值,而标记在外部ASN1Data中表示
示例 - 解码隐式标记的 INTEGER
int = OpenSSL::ASN1::Integer.new(1, 0, :IMPLICIT) # implicit 0-tagged
seq = OpenSSL::ASN1::Sequence.new( [int] )
der = seq.to_der
asn1 = OpenSSL::ASN1.decode(der)
# pp asn1 => #<OpenSSL::ASN1::Sequence:0x87326e0
#              @indefinite_length=false,
#              @tag=16,
#              @tag_class=:UNIVERSAL,
#              @tagging=nil,
#              @value=
#                [#<OpenSSL::ASN1::ASN1Data:0x87326f4
#                   @indefinite_length=false,
#                   @tag=0,
#                   @tag_class=:CONTEXT_SPECIFIC,
#                   @value="\x01">]>
raw_int = asn1.value[0]
# manually rewrite tag and tag class to make it an UNIVERSAL value
raw_int.tag = OpenSSL::ASN1::INTEGER
raw_int.tag_class = :UNIVERSAL
int2 = OpenSSL::ASN1.decode(raw_int)
puts int2.value # => 1示例 - 解码显式标记的 INTEGER
int = OpenSSL::ASN1::Integer.new(1, 0, :EXPLICIT) # explicit 0-tagged
seq = OpenSSL::ASN1::Sequence.new( [int] )
der = seq.to_der
asn1 = OpenSSL::ASN1.decode(der)
# pp asn1 => #<OpenSSL::ASN1::Sequence:0x87326e0
#              @indefinite_length=false,
#              @tag=16,
#              @tag_class=:UNIVERSAL,
#              @tagging=nil,
#              @value=
#                [#<OpenSSL::ASN1::ASN1Data:0x87326f4
#                   @indefinite_length=false,
#                   @tag=0,
#                   @tag_class=:CONTEXT_SPECIFIC,
#                   @value=
#                     [#<OpenSSL::ASN1::Integer:0x85bf308
#                        @indefinite_length=false,
#                        @tag=2,
#                        @tag_class=:UNIVERSAL
#                        @tagging=nil,
#                        @value=1>]>]>
int2 = asn1.value[0].value[0]
puts int2.value # => 1相关用法
- Ruby ASN1Data.new用法及代码示例
- Ruby ASN1.decode_all用法及代码示例
- Ruby ASN1.decode用法及代码示例
- Ruby ASN1.traverse用法及代码示例
- Ruby ASN1模块用法及代码示例
- Ruby Array.push用法及代码示例
- Ruby Array.hash用法及代码示例
- Ruby ARGF.path用法及代码示例
- Ruby Addrinfo.ip_address用法及代码示例
- Ruby Array permutation()用法及代码示例
- Ruby Array.to_a用法及代码示例
- Ruby Array.to_h用法及代码示例
- Ruby Array.to_s用法及代码示例
- Ruby Array class fill()用法及代码示例
- Ruby Array.array + other_array用法及代码示例
- Ruby Array product()用法及代码示例
- Ruby Array zip()用法及代码示例
- Ruby Array concat()用法及代码示例
- Ruby Array类用法及代码示例
- Ruby Addrinfo.connect_from用法及代码示例
- Ruby Array.take()用法及代码示例
- Ruby Array.reject!用法及代码示例
- Ruby Array.flatten!用法及代码示例
- Ruby Array.reject用法及代码示例
- Ruby Array compact!()用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 ASN1Data类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
