【问题标题】:Confused about BER (Basic Encoding Rules)对 BER(基本编码规则)感到困惑
【发布时间】:2013-08-29 12:27:47
【问题描述】:

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

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

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

让我们看一个简单的 ASN.1 架构:

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

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

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

{ "Bob" }

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

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

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

我得到的是:

30 05 80 03 42 6F 62

现在,我了解了这种编码的一些。第一个八位字节30标识符,它告诉我们SEQUENCE 类型是第一个对象。 30 在二进制中是00110000,这意味着我们有一个class0,一个PC(原始/构造)位1(意思是构造)和一个标签号10000 (十进制的 16)表示SEQUENCE

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

好的,到目前为止还不错。

但是……我对下一个八位字节 80完全困惑。那是什么意思???我本来期望值为 00001100(对于标记号 12,表示 UTF8String。)

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

【问题讨论】:

    标签: encoding asn.1 ber


    【解决方案1】:

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

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

    【讨论】:

    • 但是解码器怎么知道03 42 6F 62代表一个UTF-8字符串呢?没有指示数据是 UTF8string 类型的标识符八位字节
    • 您必须拥有原始 ASN.1 规范。从 ASN.1 规范中,您可以推断用于该字段的自动标记是指 UTF8String。如果您使用 ASN.1 编译器,则 ASN.1 规范中的信息将保留在编码器/解码器的生成中,以便该字段的隐式标记与该上下文中的 UTF8String 相关联。
    【解决方案2】:

    80 表示上下文特定的类、原语、标记号 0。这是因为您指定了一个 AUTOMATIC TAGGING 环境,该环境自动将 [0] 标记分配给类型为 Human 的字段 name .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 2021-09-11
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多