我该如何解释REAL的ASN.1 BER标准?

时间:2011-02-11 23:15:28

标签: floating-point standards asn.1 der

我一直在读

  • X.690“信息技术 - ASN.1编码规则:基本编码规则(BER),规范编码规则(CER)和可分辨编码规则(DER)规范”

特别是,§8.5.6.4(d),关于具有可变长度尾数和指数的REAL值的二进制编码,如下所示:

  

“如果第2位到第1位是11,那么第二个内容八位字节编码八位字节数, X 比如说,(作为无符号二进制数)用于编码指数的值,第三个直到( X 加3) th (包括)内容八位字节将指数的值编码为二进制补码二进制数; X 的值至少应为;发送的指数的前九位不应全部为零或全部为。“< / p>

这是不一致的,因为从“第三个到(X + 3) [rd] ”的八位字节实际上是X + 1个八位字节。

有人能够澄清这一部分吗?

我认为应该阅读

  

“...然后第二个内容八位字节编码一个小于的八位字节数, X 说,......”

  

“......第三个到(X加2) nd (含)内容八位字节......”

并且, X 的最小值是1,还是0 意味着 1个八位字节?

ADDENDUM :如果有人能为我提供一些有用的BER编码值(八位字符串及其含义)的测试数据,那将会很有帮助。

到目前为止我所拥有的是

  • 09 00 = 0(零)
  • 09 01 40 = + INF(无穷大)
  • 09 01 41 = -INF
  • 09 08 03 2b 31 2e 30 65 2b 30 =“+ 1.0e + 0”= 1.0(精确十进制)
  • 09 05 80 fe 55 55 55 = 1398101.25(二进制,0x55​​5555 * 2 ^ -2)

我不确定的一个例子是:

  • ? 09 06 83 00 fc 00 00 01 = 0.0625(二进制,0x000001 * 2 ^ -4)?

此外,似乎没有为NaN定义编码(不是数字)。

2 个答案:

答案 0 :(得分:2)

我认为这只是一个索引问题。

内容八位字节#1包含一些内容(编码类型,符号位,基数,比例因子和指数格式)。

如果指数格式为'11',则下一个八位字节(内容八位字节#2)包含一个数字X,表示用于编码指数值的八位字节数。第三个Content Octet包含指数值的一部分。最后一个Content Octet是x + 3。

CO1(填料)CO2(x)CO3(指数值)...... CO [x + 3]

x的最小值为1.如果x = 1则CO [x + 3] = CO4,这意味着指数值的最小内容八位字节数为2。这种形式的最短表示是

CO1 CO2 CO3 CO4

这意味着'09 00'不是8.5.6节的有效编码。与'09 01 04'和'09 01 41'一样。

PLUS-INFINITY和MINUS-INFINITY通过8.5.8节的规则进行编码,该规则与8.5.6节的规则不兼容。

按照8.5.6节的规则编码为零

CO1:8  =  1      (Content Octet #1 bit 8)
CO1:7  =  x =  0 (Content Octet #1 bit 7 is dont care, but I'll use 0 for positive)
CO1:65 = 00      (Content Octet #1 bits 6 and 5 is 00 for base two)
CO1:43 =  x = 01 (Content Octet #1 bits 4 and 3 is scaling factor, so we don't care but I'll make it 01 for a value of one)
CO1:21 = 11      (Content Octet #1 bits 2 and 1 is the exponent format and '11' is the format in question)

所以Content Octet#1 = 1000 0111是0x87

内容八位字节#2 = 0x01(因为X的最小值是1)

内容八位字节#3 = 0x00

内容八位字节#4 = 0x01

内容八位字节#3和#4的指数值为1

(零*一)^一=零

答案 1 :(得分:0)

NaN在无穷大旁边的8.5.9中定义,并且将是09 01 42

09 06 83 00 fc 00 00 01 = 0.0625(二进制,0x000001 * 2 ^ -4)

根据8.5.7.4 d)无效,CO2(X)“至少应为1”。但是当我忽略这些约束时,我也会得到你的结果。

更好:09 03 80 fc 01 = 0.0625(二进制,0x01 * 2 ^ -4)