【问题标题】:Encoding and decoding implicit tagging编码和解码隐式标记
【发布时间】:2016-12-15 08:26:14
【问题描述】:
我有一个关于显式和隐式标记的问题,在下面的例子中
X ::= [APPLICATION 5] IMPLICIT INTEGER
对于X,由于隐式标签会将INTEGER 上的现有标签替换为[APPLICATION 5],因此BER 中值为5 的编码将采用十六进制45 01 05。解码器如何知道45 01 05的类型?
【问题讨论】:
标签:
encoding
implicit
decoding
asn.1
ber
【解决方案1】:
我怀疑您真正的问题是,“BER 解码器如何知道在使用隐式标签并且这些标签替换了原本会指示需要解码的 ASN.1 类型的标签时该怎么做?”
解码器是否可以处理隐式标签取决于解码器是否被 ASN.1 规范告知,该规范提供了必要的上下文。对 SEQUENCE、SET 和 CHOICE 的组件施加了一些要求,以确保解码器可以读取标签并知道需要解码的组件以及类型是什么。这需要了解 ASN.1 规范。
相比之下,未受 ASN.1 规范通知的通用 BER 解码器将存在隐式标签问题,因为它缺乏解释它们的必要上下文。
【解决方案2】:
解码器从八位字节流中恢复原始类型的唯一方法是知道它即将到来。 AFAIK,应该提示您的解码器在给定情况下期望什么类型,最重要的是,隐式标记类型映射的基本 ASN.1 类型。
考虑查看this book。
【解决方案3】:
通常,BER 解码器由 ASN.1 编译器根据给定规范(模式)生成。然后,在解码过程中,除了输入的编码数据外,用户还将指定他们想要解码的类型。使用类型信息,解码器将知道要解码什么。
【解决方案4】:
首先,我查了一本寄给我的《ASN.1 异构系统之间的通信》一书Ilya Etingof,下面显示了更多详细信息:
“IMPLICIT 标记按如下方式进行:以下所有标记,明确提及或通过类型引用间接到达的标记都将被忽略直到下一次出现(包括)UNIVERSAL 类标记(除非之前遇到过 EXPLICIT 标记)。因此,对于下面的类型 T:
T ::= [1] 隐式 T1
T1 ::= [5] 隐式 T2*
T2 ::= [APPLICATION 0] 隐式 整数
只有标签 [1] 应该被编码。解释概念的另一种方式
隐式标记是说标记为 IMPLICIT 的标记覆盖
紧随其后的标签(递归);因此,对于上面的示例,标签 [1] 覆盖标签 [5],而标签 [5] 又覆盖标签 [APPLICATION 0]
最后覆盖INTEGER类型的默认标签[UNIVERSAL 2]。
在隐式模式中标记的类型只有在接收时才能被解码
应用程序“知道”抽象语法,即解码器已经
从与编码器相同的 ASN.1 模块生成(等等
大多数时候都是这样)。”
所以我猜应该在数据传输开始时在表示层中进行(ASN1规范)的协商。