ASN.1 BER处理标签号31或更高

时间:2017-03-16 07:38:59

标签: decoding asn.1 ber

我正致力于解码ASN.1 BER编码数据,并且我想知道Tag 31(具体)和更高版本的正确处理应该是什么。我觉得X.690规范有点含糊不清,我没有任何标签为31或更高的数据示例。

有问题的部分是8.1.2.4,处理大于或等于31的标签;特别是8.1.2.4.1 c)其中说:

  

c)第5位到第1位应编码为11111 2

然后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位是否应被视为标签号的一部分?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以尝试使用不同的ASN.1编码here

这是我的标记编码implementation,显然可以与其他许多人一起使用。