0

我正在解码 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 位是否应该被视为标签号的一部分?

4

2 回答 2

0

第 8.1.2.4.2 节非常简单。如果标签不适合标识符八位字节的 5 位,则将它们设置为 11111 以声明标签编号更大,并将在下一个八位字节中编码。

恕我直言,您的解释是正确的。规范 ITU-T X.690 (08/2015) 在第 8.1.2.4.3 节中很好地说明了大于 30 的标签。标签号是从(在插图中)计算2nd octet到的Last octet

于 2017-03-16T08:17:58.283 回答
0

您可以在这里试验不同的 ASN.1 编码。

这是我的标签编码实现,它显然适用于许多其他人。

于 2017-03-16T09:59:48.770 回答