[英]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)或负零值进行编码) 。
0x02
是0b00000010
,因此(b)在这里适用。 8.5.8描述了三种可能的形式,在ISO 6093中作了进一步规定。由于这是一个ISO标准,因此您将无法免费找到一种形式。 我相信这些格式是所有ASCII字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.