如何使用ASN.1进行编码?

时间:2016-02-04 18:42:48

标签: asn.1

我对ANS1编码很新,我需要一些指导。

...假设我有以下ANS1

MyType ::= SEQUENCE 
{ 
--lets assume hex value here is "01-01" for myText1
myText1 [0] IMPLICIT OCTET STRING OPTIONAL, 
myCheck [1] IMPLICIT INTEGER {doNow(0), doLater(1)} DEFAULT doNow,
myText2 [2] OCTET STRING
}

如果 myText2 的值为" 12-34",以下十六进制字符串30-08-01-01-01-01-04-02-12-34是否会被视为正确编码的数据?

...如果缺少可选的 myText1 ,则编码为

30-06-01-01-04-02-12-34

30-07-00-01-01-04-02-12-34

1 个答案:

答案 0 :(得分:2)

假设我们想要使用BER编码规则对值{myText1 '0101'H, myCheck 0, myText2 '1234'H}进行编码:

30 0D                 SEQUENCE (universal tag 16, constructed) of length 13
   80 02 01 01        context specific implicit tag 0, length 2, value 0101
   81 01 00           context specific implicit tag 1, length 1, value 00
   C2 04              context specific explicit tag 2, length 4
      04 02 12 34     universal tag 4, length 2, value 1234

如果省略了可选字段,则不存在相应的编码,例如,如果我们省略myText1(请注意myText2不是可选的):

30 09                 SEQUENCE of length 9
   81 01 00           context specific implicit tag 1, length 1, value 00
   C2 04              context specific explicit tag 2, length 4
      04 02 12 34     universal tag 4, length 2, value 1234

在编码序列值和显式标记的myText2值时,请注意构造的表格位的用法。进一步注意隐式标记和显式标记之间的区别。