我被赋予了关于主题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?就像那样?
答案 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)。
0x02
为0b00000010
,因此(b)适用于此处。 8.5.8描述了三种可能的形式,在ISO 6093中进一步规定。由于这是ISO标准,你将找不到一个免费提供的形式。我相信这些格式都是ASCII字符串。