codec - 可扩展序列的 UPER 编码说明

标签 codec asn.1

我有以下 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/

相关文章:

c++ - 带有可选字段的 ASN.1 编码

c - ASN.1 编码文件

javascript - 使用 javascript 解析时间戳响应文件 (tsr)

codec - DICOM 像素数据压缩解压能否搞乱窗口中心和窗口宽度

codec - Speex 编解码器是否适用于移动 VOIP 应用程序?

video - 是否有用于截屏压缩的良好开放编解码器

java - 从 ASN1 加密的 pem 证书中获取公钥和私钥

c++ - 如何正确使用和释放asn1c SEQUENCE_OF?

c++ - 如何加速OpenH264的解码器

video - 在ffmpeg中编码DXV(resolume编解码器)