我正在解码 ASN.1 BER 编码数据,我想知道标签 31(特别是)和更大的正确处理应该是什么。我觉得 X.690 规范有点模棱两可,我没有任何数据的示例,它的标签为 31 或更大。
有问题的部分是 8.1.2.4 处理大于或等于 31 的标签;特别是 8.1.2.4.1 c) 它说:
c) 比特 5 到 1 应编码为 11111₂</p>
然后 8.1.2.4.2 说:
随后的八位字节应按如下方式对标签的编号进行编码:
a) 每个八位字节的第 8 位应设置为 1,除非它是标识符八位字节的最后一个八位字节;
b) 第一个后续八位字节的比特 7 到 1,随后是第二个后续八位字节的比特 7 到 1,然后依次是每个后续八位字节的比特 7 到 1,直到并包括标识符八位字节中的最后一个后续八位字节。是等于标记号的无符号二进制整数的编码,第一个后续八位字节的第 7 位作为最高有效位;
c) 第一个后续八位字节的第 7 到 1 位不应全部为零。
基于此,您如何对标签 31 进行编码?我认为这意味着,除了表示正在表示标签 31 或更大之外,就表示实际标签号而言,第一个八位字节的第 5 到 1 位应被忽略,并且实际标签号以八位字节编码2 从第 8.1.2.4.2 节开始。在此方案中,标签 31 将是:
. . . 1 1 1 1 1 0 0 0 1 1 1 1 1
所以; 在第一个八位字节中,位 5 到 1 设置为 1,但它们不构成标签编号的一部分。第二个八位字节的第 5 位到第 1 位也是 1,但这次它们确实代表正在编码的标签号。
谁能确认我的解释是否正确,或者当标签 >= 31 时,第一个八位字节的第 5 到 1 位是否应该被视为标签号的一部分?