繁体   English   中英

ASN.1 REAL-BER解码

[英]ASN.1 REAL - BER decoding

我得到了有关主题ASN.1解码格式的任务。 我通过了一个存储结构标记为REAL的东西,我必须将其拆解并放入double类型。 问题是Internet上的信息很少。 我需要转换为十进制形式的数字。

这是一个例子:

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:

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

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

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

c)如果位8 = 0且位7 = 1,则按照“ 8.5.9”对“ SpecialRealValue”(参见ITU-T X.680建议书| ISO / IEC 8824-1)或负零值进行编码) 。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM