ASN.1/BER中“Constructed”术语的实际含义是什么?
ASN.1/BER Constructed属性相关问题解答
1. Constructed属性的定义,与Explicit前缀的关系
ASN.1 BER规则中,标识符字节(编码的第一个字节)的位定义从高位到低位为:
- 第8、7位:标签类(通用类/应用类/上下文特定类/私有类)
- 第6位:Constructed属性位
- 第5-1位:标签号
Constructed属性的核心含义是标识当前ASN.1对象的内容区结构:
- 该位为0(Primitive类型):内容区直接存储当前对象的原始值,没有嵌套其他完整ASN.1编码
- 该位为1(Constructed类型):内容区存储的是一个或多个完整的ASN.1编码对象,属于嵌套结构
你提到的Explicit [nn]前缀和Constructed属性有相关性,但并非同一概念:Explicit标签本质是强制为Constructed类型的上下文特定标签,添加Explicit前缀相当于给原ASN.1对象外层套了一层新的上下文类标签,该外层标签的Constructed位必须置1,内容区就是原对象的完整编码。但Constructed属性的适用范围远不止Explicit标签,所有嵌套结构(如SEQUENCE、SET、嵌套的CHOICE成员等)的标签都会将该位置1。
2. 0x10开头的SEQUENCE编码是否合法
首先明确SEQUENCE的通用类标签号为16(二进制10000),通用类的类位值为00:
- 合法SEQUENCE的标识符字节计算方式为:
00(通用类) +1(Constructed位置1) +10000(标签号) = 二进制00110000,即大家常见的0x30开头 - 你提到的
0x10二进制为00010000,对应的是通用类、Constructed位置0、标签号16,也就是Primitive类型的通用标签16
这种0x10开头的编码完全非法:X.690标准明确规定,SEQUENCE、SET两种通用类型天生属于Constructed类型,不存在Primitive形式的定义,其标识符的Constructed位必须置1。解码器遇到0x10标签时只会将其识别为未知的Primitive类型,不会判定为SEQUENCE,直接会触发解码失败。
内容的提问来源于stack exchange,提问作者Tuntable
相关产品推荐
相关产品推荐

