PER编码中多值约束INTEGER类型的编码规则技术咨询
ASN.1 PER 多值约束 INTEGER 编码问题解答
测试场景回顾
你通过asn1tools完成两组测试:
- 单值约束整数:
输入Num1 ::= INTEGER (40)40时编码结果为b'',符合X.691 13.2.1的规则 - 多值联合约束整数:
输入Num2 ::= INTEGER (40 | 50 | 60)40/50/60均得到空比特串,解码空串返回40,与预期的类ENUMERATED索引编码不符
核心结论与标准依据
你遇到的asn1tools编码结果不符合X.691标准,具体分析如下:
单值约束的明确边界
X.691 13.2.1的“编码为空”规则仅适用于约束将整数类型的取值集合限制为唯一值的场景(即集合大小为1)。Num2的约束包含3个离散值,属于多值联合约束,完全不属于单值约束范畴,因此不能触发“编码为空”的规则。多值约束 INTEGER 的正确PER编码逻辑
根据X.691 13.2.3条款,当整数类型的可见约束是多个离散值的集合时,编码步骤为:
- 将约束中的所有值按升序排序
- 编码当前值在排序后列表中的索引,使用能覆盖所有索引的最小比特数(比如3个值需要2比特:
00对应40,01对应50,10对应60)
- 工具行为的异常性
你观察到的“所有输入编码为空、解码空串返回40”是asn1tools的非标准实现行为,大概率是工具对多值约束的INTEGER处理逻辑存在bug,误将其判定为单值约束,或未正确实现X.691 13.2.3的编码规则。
补充说明
ENUMERATED类型的索引编码规则是专门针对枚举类型的设计,PER标准并未将多值约束的INTEGER与ENUMERATED的编码逻辑等同,必须严格遵循INTEGER对应的约束编码条款(X.691第13.2节)。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

