ASN.1 REAL - BER解码

时间:2015-01-26 07:26:42

标签: c++ algorithm data-structures stl asn.1

我被赋予了关于主题ASN.1解码格式的任务。我传递的东西存储结构标签是REAL,我必须拆解它并放入类型double。问题是互联网上的信息非常少。我需要转换十进制表格的数字。

以下是一个例子:

first-man NUMBER ::= 
{  
    numb 11.987
}

结果是一个数字:

30098007 0231312E 393837

很多问题,标准BER说明:

A BER encoded "tag" is made up of several bit fields:

---------------------------------
| 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---------------------------------
|Class  |P/C| Tag Number        |
---------------------------------

如果我知道我将完全使用REAL类型,那么为什么我要解析这个结构,因为它只选择标签。好吧,我们得到了数字 30098007 0231312E 393837 。所以呢?我可以放弃解码 11.987 ,因为我知道它是一个浮点数。一般来说,微软是否有任何结构用于编码?

或者如果我知道我的十进制数字。我刚用来解码字符串?例如NR2 =“+5.65”形式的数字5.65?就像那样?

2 个答案:

答案 0 :(得分:2)

解压缩嵌套块:

30 09     -- SEQUENCE, of length 9
   80 07  -- [0], context-specific Tag 0 of length 7
      02 31 31 2E 39 38 37 -- ?? "11.987"

特定于上下文意味着应该从上下文中了解其含义。例如,我不知道它意味着什么,因为我没有任何上下文。至于02字节 - 它可以是任何东西。

因此,如果没有进一步的信息,这将无法解码。它来自哪里?

答案 1 :(得分:2)

参见ITU-T X.690,§8.5,其中描述了REAL类型的内容编码。实际上,REAL值很少使用。

Tony提供了一个很好的编码细分,这是一个标签长度值三元组,但编码02 31 31 2E 39 38 37可能会稍微澄清一下。要理解02前缀,我们需要参考§8.5.6:

  

第一个内容八位位的第8位应设置如下:

     

a)如果位8 = 1,则应用8.5.7中规定的二进制编码;

     

b)如果位8 = 0且位7 = 0,则适用8.5.8中规定的十进制编码;

     

c)如果位8 = 0且位7 = 1,则“SpecialRealValue”(参见ITU-T X.680建议书| ISO / IEC 8824-1)或值减零编码如8.5 0.9)。

0x020b00000010,因此(b)适用于此处。 8.5.8描述了三种可能的形式,在ISO 6093中进一步规定。由于这是ISO标准,你将找不到一个免费提供的形式。我相信这些格式都是ASCII字符串。