存在扩展时UPER中CHOICE索引如何编码?dm200编码解析疑问
ASN.1 UPER编码解析:dm200编码细节拆解
场景信息
输入数据(JSON格式)
{ "messageData": { "elementIds": [ { "dm200": null } ] } }
生成的UPER编码结果
0001100000001010101100000000100000000000
已完成的解析
前3位
000:对应elementIds的序列长度,规则为实际长度-1,计算得0+1=1,匹配输入的1个元素。第4位
1:标记当前选择的MsgElementId属于扩展组件(即不在根组件集合0-114范围内)。
完整编码拆解(结合UPER规则)
结合给出的ASN.1 Schema和ITU-T X.691的UPER规则,剩余比特解析如下:
1. CHOICE扩展组件的偏移量编码
Schema中MsgElementId的根组件范围是dm0(标签0)到dm114(标签114),dm200的标签为200,属于扩展组件。根据UPER规则,扩展组件需编码标签偏移量:
- 偏移量计算:
目标标签值 - 根组件最大标签值 = 200 - 114 = 86 - 86的二进制为
01010110,这就是编码中对应的8位比特,与你观察到的结果一致。
2. 剩余比特的含义
剩余比特分为两部分:
- 扩展组件长度标识:第4位之后的
10000000用于标识偏移量的存储长度。由于偏移量86需要8位存储,该字段标记后续将用1字节(8位)存储偏移量。 - 字节对齐填充:编码末尾的
00000001000000000000是UPER的对齐填充。UPER要求最终编码结果必须是字节的整数倍,当必要编码比特数未达字节边界时,会填充0至最近的字节边界。
3. NULL类型的编码
由于dm200的类型是NULL,UPER对NULL类型的编码规则为无内容编码,因此不需要额外比特表示NULL的值。
对应的ASN.1 Schema
Messages DEFINITIONS ::= BEGIN Message ::= SEQUENCE { messageData MessageData } MessageData ::= SEQUENCE { elementIds SEQUENCE SIZE (1..7) OF MsgElementId } MsgElementId ::= CHOICE { dm0 [0] NULL, dm1 [1] NULL, dm2 [2] NULL, dm3 [3] NULL, dm4 [4] NULL, . .(此部分已截断以简化内容) . dm111 [111] NULL, dm112 [112] NULL, dm113 [113] NULL, ..., dm114 [114] NULL, dm115 [115] NULL, dm116 [116] NULL, . .(此部分已截断以简化内容) . dm200 [200] NULL, dm201 [201] NULL, dm202 [202] NULL, dm203 [203] NULL, dm204 [204] NULL, dm205 [205] NULL, dm206 [206] NULL, dm207 [207] NULL, dm208 [208] NULL } END
内容的提问来源于stack exchange,提问作者Yash Bhutada
相关产品推荐
相关产品推荐

