【问题标题】:ASN.1 REAL - BER decodingASN.1 REAL - BER 解码
【发布时间】:2015-01-26 07:26:42
【问题描述】:

我的任务是关于 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?就这样?

【问题讨论】:

  • 如果“31​​31​2E 39​38​37”中的每两个十六进制数字被识别为ASCII字符代码,则它们变为“1 1 . 9 8 7”。
  • @Fumu 7 - 那么这意味着 02 31312E 393837?
  • 不,“31312E 393837”可以解释为“11.987”。 “02”不是可打印的代码。 Ascii 代码 &h02 是控制代码 STX(TeXt 状态)。让我们看看asciitable.com的ASCII码表,你可能会发现十六进制中的“31”(Hx)表示字符“1”,“2E”表示字符“.”,等等。
  • 现在numb 定义了吗?
  • @Fumu7 02 为控制字节,表示号码为NR2格式

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


【解决方案1】:

解压嵌套块:

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

因此,如果没有更多信息,就无法解码。它是从哪里来的?

【讨论】:

  • 我刚刚尝试了网站上的各种示例:asn1-playground.oss.com。也就是说,如果我确定我有一个 REAL 并且代码是从十进制数中获得的,那么在解码时我可以安全地丢弃它:02 30098007?
  • 我不知道。你还没有正确描述你的任务。特别是,您必须告诉我们 (i) numb 的定义; (ii) 上下文特定标签[0]的含义。
  • 没有ASN.1类型DOUBLE
  • 好的,现在我明白了。所以请回答我的问题(i)和(ii)。
  • 那么,无论你做什么都只是在黑暗中拍摄。
【解决方案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 .9)。

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

【讨论】: