我有以下 ASN.1 SEQENCE 类型,具有以下值,并在 UPER 中生成以下编码。我感兴趣的是为什么编码看起来像这样,特别是开始,因为它在多个编译器和编码器(开源和商业)之间是一致的,但通过阅读规范,我不明白这是如何可能的。
第一个字节是1110 0000
,我不明白编码中怎么开始是111
,从顺序和值来看,感觉就像它应该是 11
一样,因为第一位是扩展添加存在标志,第二位是第一个 bool 值,但是我不知道第三个 1
在哪里来自,从阅读 X.691 规范来看,接下来应该是扩展添加位域的通常较小的整数长度决定因素,并且由于扩展添加的数量是 3,所以下一个位应该为零以指示它是一个小于 64 位的位字段,后跟位字段,但在每个实现中,第三位是 1
,规范中是否有我遗漏的内容可以解释为什么第三位是1
而不是0
?
编辑:
第二个字节是 0111 0000
,这意味着位字段长度可能为 1 (1
) 或 3 11
,但给出了最近的答案表明实际上只有两个扩展添加,我很困惑扩展位字段的长度决定因素应该是什么。
架构和值
G ::= SEQUENCE {
a BOOLEAN,
...,
[[
b BOOLEAN
]],
[[
c BOOLEAN
]],
...,
d BOOLEAN
}
value ::= G {
a TRUE,
b TRUE,
c TRUE,
d TRUE
}
编码(十六进制):
E070180018000A
最佳答案
组件“a”和“d”构成序列类型的扩展根。请注意,第二个省略号标志着扩展添加的结束和扩展根的第二部分的开始。
在此序列类型中,有两个扩展添加组。第一组包含“b”,第二组包含“c”。 PER 编码的第一位是“1”,因为序列值包含一个或多个扩展。 PER 编码的第二位包含分量“a”的编码,第三位包含分量“d”(不是“b”)的编码。
以下是此编码的说明:
offset (bits), length (bits), description
0, 1, preamble
0, 1, extension bit ('1': the sequence value is extended)
1, 1, root component 'a' ('1': TRUE)
2, 1, root component 'd' ('1': TRUE)
3, 1, format of the length of the extension bitmap ('0': a "normally small" length)
4, 6, length of the extension bitmap ('000001': the length is 1+1=2 bits) --see note below
10, 2, extension bitmap ('11')
12, 8, length of the first extension ('00000001': the length is 1 octet)
20, 8, first extension
20, 1, component 'b' ('1': TRUE)
21, 7, padding ('0000000')
28, 8, length of the second extension ('00000001': the length is 1 octet)
36, 8, second extension
36, 1, component 'c' ('1': TRUE)
36, 7, padding ('0000000')
44, 4, final padding of the complete encoding ('0000')
total length: 48 bits
11100000 01110000 00011000 00000000 00011000 00000000
E0 70 18 00 18 00
注意:“通常较小的长度”是限制在 1..64 范围内的长度决定因素。这样的长度值必须通过将长度减一编码为6位无符号整数字段来编码。
关于codec - 可扩展序列的 UPER 编码说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76297858/