Cha*_*l72 3 encoding asn.1 ber
我正在努力学习和理解BER(基本编码规则).
我一直在使用网站http://asn1-playground.oss.com/来试验不同的ASN.1对象并使用BER对它们进行编码.
然而,即使是最简单的编码似乎也让我感到困惑.
我们来看一个简单的ASN.1模式:
World-Schema DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
Human ::= SEQUENCE {
name UTF8String
}
END
Run Code Online (Sandbox Code Playgroud)
所以基本上这只是一个SEQUENCE名为UTF8String类型的字段name.
与此序列匹配的值的示例如下:
{ "Bob" }
Run Code Online (Sandbox Code Playgroud)
所以,使用http://asn1-playground.oss.com/,我产生以下数据的BER编码:
some-guy Human ::=
{
name "Bob"
}
Run Code Online (Sandbox Code Playgroud)
我希望这会生成一个序列对象,后跟一个字符串对象.
我得到的是:
30 05 80 03 42 6F 62
Run Code Online (Sandbox Code Playgroud)
现在,我了解了一些编码.第一个八位字节,30,是标识,它告诉我们,一个SEQUENCE类型是第一个对象.的30是00110000在二元的,这意味着我们具有class的0,一台PC的(原始/构造的)比特1(意思构造),以及一个标签编号10000(十进制16),这意味着SEQUENCE
到现在为止还挺好.下一个值是LENGTH,以字节为单位SEQUENCE,即05.
好的,还是那么好.
但是......我完全被下一个八位字节搞糊涂了80.那是什么意思???我希望值00001100(对于标签号12,意思是UTF8String.)
后面的字节80非常简单:03表示长度为3,而且42 6F 62只是UTF8String值本身,"Bob"
小智 6
80是特定于上下文的标记0.请注意,模块开头使用"AUTOMATIC TAGS".这表明所有SEQUENCE,SET和CHOICE类型都将为其组件以[0]开头的上下文特定标签,并为每个后续组件递增1.这样,在创建消息时,您不必担心标记冲突,尤其是在处理可选或具有DEFAULT值的组件时.如果您将"AUTOMATIC"更改为"EXPLICIT"(我不建议这样做),您将看到编码时期望的[UNIVERSAL 12].
请注意,AUTOMATIC TAGS仅适用于SEQUENCE,SET或CHOICE组件上的标签.它不适用于顶级组件,这就是为什么你在SEQUENCE中看到[UNIVERSAL 16]而不是在那里看到特定于上下文的标签的原因.