6

我正在尝试学习和理解 BER(基本编码规则)。

我一直在使用网站http://asn1-playground.oss.com/来试验不同的 ASN.1 对象并使用 BER 对它们进行编码。

然而,即使是最简单的编码似乎也让我感到困惑。

让我们看一个简单的 ASN.1 模式:

World-Schema DEFINITIONS AUTOMATIC TAGS ::= 
BEGIN
  Human ::= SEQUENCE {
     name UTF8String
  }
END

所以基本上这只是一个SEQUENCE带有单个 UTF8String 类型字段的称为name.

与此序列匹配的值的示例如下:

{ "Bob" }

因此,使用http://asn1-playground.oss.com/,我生成以下数据的 BER 编码:

some-guy Human ::= 
{  
    name "Bob"
}

我希望这会产生一个序列对象,然后是一个字符串对象。

我得到的是:

30 05 80 03 42 6F 62

现在,我了解了一些这种编码。第一个八位位组 ,30是告诉我们类型是第一个对象的标识符。是二进制SEQUENCE的,这意味着我们有一个of ,一个 PC(原始/构造)位(意思是构造)和一个标记号(十进制 16),这意味着3000110000class0110000SEQUENCE

到目前为止,一切都很好。下一个值是 的字节长度SEQUENCE,即05

好吧,到目前为止还是那么好。

但是然后......我完全被下一个 octet弄糊涂80了。这意味着什么???我本来期望值为 00001100(对于标签号 12,表示 UTF8String。)

后面的字节80非常简单:03表示长度为 3,而42 6F 62只是 UTF8String 值本身,"Bob"

4

2 回答 2

9

80 是特定于上下文的标记 0。请注意,在模块的开头使用了“AUTOMATIC TAGS”。这表明所有 SEQUENCE、SET 和 CHOICE 类型的组件都将具有特定于上下文的标签,这些标签从 [0] 开始,并为每个后续组件递增 1。这样,您在创建消息时不必担心标签冲突,尤其是在处理可选或具有默认值的组件时。如果您将“AUTOMATIC”更改为“EXPLICIT”(我不建议这样做),您将看到您在编码中所期望的 [UNIVERSAL 12]。

请注意,AUTOMATIC TAGS 仅适用于 SEQUENCE、SET 或 CHOICE 组件上的标签。它不适用于顶级组件,这就是为什么您看到 SEQUENCE 的 [UNIVERSAL 16] 而不是在那里也看到特定于上下文的标签。

于 2013-08-28T15:35:50.177 回答
1

80 indicates context specific class, primitive, tag number 0. This is there because you specified an AUTOMATIC TAGGING environment, which automatically assigned a [0] tag to field name in type Human.

于 2013-08-27T17:39:38.467 回答