0

在以下示例中,我对显式和隐式标记有疑问

X ::= [APPLICATION 5] IMPLICIT INTEGER

对于X,由于隐式标记将替换现有标记 on INTEGER[APPLICATION 5]因此值 5 的 BER 中的编码将是十六进制的45 01 05。解码器如何知道来自的类型45 01 05

4

4 回答 4

1

我怀疑您真正的问题是,“BER 解码器如何知道在使用隐式标签并且这些标签替换了原本会发出需要解码的 ASN.1 类型的标签时该怎么做?”

解码器是否可以处理隐式标签取决于解码器是否被 ASN.1 规范通知,该规范提供了必要的上下文。对 SEQUENCE、SET 和 CHOICE 的组件有一些要求,以确保解码器可以读取标签并知道需要解码的组件以及类型是什么。这需要了解 ASN.1 规范。

相比之下,未受 ASN.1 规范通知的通用 BER 解码器将存在隐式标签问题,因为它缺乏解释它们的必要上下文。

于 2016-12-15T15:33:45.597 回答
0

首先,我查了一本寄给我的“ASN.1 异构系统之间的通信”一书Ilya Etingof,下面显示了更多详细信息:

“IMPLICIT 标记按如下方式进行:以下所有标记,明确提及或通过类型引用间接到达的标记都将被忽略,直到 UNIVERSAL 类标记的下一次出现(包括)(除非之前遇到 EXPLICIT 标记)。因此,对于下面的T型:

T ::= [1]隐式T1

T1 ::= [5]隐式T2*

T2 ::= [应用程序 0] 隐式整数

只有标签 [1] 应该被编码。解释隐式标记概念的另一种方式是说标记为 IMPLICIT 的标记会覆盖它后面的标记(递归地);因此,对于上面的示例,标签 [1] 覆盖标签 [5],标签 [5] 进而覆盖标签 [APPLICATION 0],最终覆盖INTEGER类型的默认标签[UNIVERSAL 2] 。

仅当接收应用程序“知道”抽象语法时,才能解码以隐式模式标记的类型,即解码器是从与编码器相同的 ASN.1 模块生成的(大多数时间都是这种情况)。 "

所以我想在数据传输开始时应该在表示层中进行(ASN1规范)的协商。

于 2016-12-16T16:30:59.960 回答
0

通常,BER 解码器由 ASN.1 编译器根据给定的规范(模式)生成。然后,在解码过程中,除了输入的编码数据,用户还将指定他们想要解码的类型。使用类型信息,解码器将知道要解码什么。

于 2016-12-15T17:22:00.487 回答
0

解码器从八位字节流中恢复原始类型的唯一方法是知道它即将到来。AFAIK,你的解码器应该被提示在给定的情况下期望什么类型,最重要的是,隐式标记类型映射的基本 ASN.1 类型。

考虑看看这本书

于 2016-12-15T11:46:48.483 回答