我正在努力学习和理解BER (基本编码规则)。
我一直在使用http://asn1-playground.oss.com/网站对不同的ASN.1对象进行实验,并使用误码率对它们进行编码。
然而,即使是最简单的编码似乎也让我感到困惑。
让我们来看一个简单的ASN.1模式:
World-Schema DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
Human ::= SEQUENCE {
name UTF8String
}
END因此,基本上这只是一个SEQUENCE,它有一个名为name的UTF8String类型字段。
与此序列匹配的值的示例如下:
{ "Bob" }因此,使用http://asn1-playground.oss.com/,我生成以下数据的误码率编码:
some-guy Human ::=
{
name "Bob"
}我希望这会产生一个序列对象,然后是一个字符串对象。
我得到的是:
30 05 80 03 42 6F 62现在,我理解其中的一些编码。第一个八进制,30,是一个标识符,它告诉我们SEQUENCE类型是第一个对象。30是二进制的00110000,这意味着我们有一个class of 0,一个PC (原语/构造的)位1 (意指构造),以及一个10000 (16小数位)的标记数,意思是SEQUENCE。
到目前一切尚好。下一个值是SEQUENCE的长度(以字节为单位),即05。
好吧,到目前为止还不错。
但后来..。我是,被下一个八重奏80完全搞糊涂了。这是什么意思??我希望值为00001100 (对于标记号12,意思是UTF8String)。
80后面的字节非常简单:03表示长度为3,而42 6F 62只是UTF8String值本身,"Bob"
发布于 2013-08-28 15:35:50
80是一个特定于上下文的标记0。请注意,“自动标签”是使用在模块的开头。这意味着所有序列、集合和选择类型都将为其组件设置上下文特定的标记,每个后续组件将增加1。这样,在创建消息时,特别是在处理可选或具有默认值的组件时,不必担心标记冲突。如果您将“自动”更改为“显式”(我不建议这样做),您将看到编码中期望的通用12。
请注意,自动标记只适用于序列、集或选择组件上的标记。它不适用于顶级组件,这就是为什么您看到了序列的通用16,而不是看到特定于上下文的标记。
发布于 2013-08-27 17:39:38
80表示上下文特定的类、基元、标记号0。这是因为您指定了一个自动标记环境,该环境自动将标记分配给输入Human的字段名。
https://stackoverflow.com/questions/18453894
复制相似问题