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

7
我一直在阅读:
  • X.690 "信息技术 - ASN.1编码规则:基本编码规则(BER),规范编码规则(CER)和区分编码规则(DER)"

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

"如果位2到1为11,则第二个内容字节编码八位字节数,记为 X(作为无符号二进制数)用于编码指数的值,并且第三个到第(X+3)th(含)个内容字节以二进制补码数字编码指数的值;X应至少为1;传输指数的前九位不能全部为零或全部为1。"

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

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

我认为它应该是这样写:

"…则第二个内容字节编码八位字节数少一个,记为X…"

或者

"…第三个到第(X+2)nd(含)个内容字节…"

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

补充说明:如果有人能够为我提供各种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 (二进制,0x555555 * 2^-2)

我不确定的一个例子是:

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

此外,似乎没有定义NaN(非数字)的编码。

2个回答

2
我认为这只是一个索引的问题。
内容八位元组#1包含一些内容(编码类型、符号位、基数、比例因子和指数格式)。
如果指数格式为“11”,则下一个八位元组(Content Octet #2)包含一个数字X,表示用于编码指数值的八位元组数量。第三个内容八位元组包含指数值的一部分。最后一个内容八位元组是x+3。
CO1(内容) CO2(X) CO3(指数值) ... CO[x+3]
x的最小值为1。如果x=1,则CO[x+3]=CO4,这意味着指数值的最小内容八位元组数为两个。这种形式的最短表示为
CO1 CO2 CO3 CO4
这意味着'09 00'不是第8.5.6节的有效编码。'09 01 04'和'09 01 41'也是如此。
正无穷大和负无穷大是通过第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)

因此,内容八位元#1 = 1000 0111 等于 0x87

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

内容八位元#3 = 0x00

内容八位元#4 = 0x01

内容八位元#3和#4给出指数值为1

(零乘一)^一=零


0

NaN在8.5.9中与Infinity一起定义,其值为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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接