ASN.1 REAL - BER 解码

ASN.1 REAL - BER decoding

我接到了关于 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 ,因为我知道它是一个浮点数。并且一般情况下,Microsoft 中是否有针对此编码的任何结构?

或者如果我知道我的十进制数字。我只是用来解码字符串?比如NR2 = "+5.65" 形式的数字5.65?就这样?

解压嵌套块:

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 字节——它可以是任何东西。

所以如果没有进一步的信息就无法解码。它来自哪里?

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

Tony 提供了很好的编码分解,这是一个标签-长度-值三元组,但编码 02 31 31 2E 39 38 37 需要稍微说明一下。要理解02前缀,我们需要查阅§8.5.6:

Bit 8 of the first contents octet shall be set as follows:

a) if bit 8 = 1, then the binary encoding specified in 8.5.7 applies;

b) if bit 8 = 0 and bit 7 = 0, then the decimal encoding specified in 8.5.8 applies;

c) if bit 8 = 0 and bit 7 = 1, then either a "SpecialRealValue" (see ITU-T Rec. X.680 | ISO/IEC 8824-1) or the value minus zero is encoded as in 8.5.9).

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