2011-02-11 72 views
5

我一直在读我应该如何解释REAL的ASN.1 BER标准?

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

特别地,§8.5.6.4(d),关于REAL值的用可变长度尾数和指数的二进制编码,内容如下:

“如果位2至1是11,那么第二个c ontents八位位组编码的八位位组数,X说,(为一个无符号二进制数)用于编码指数的值,和所述第三至(3 X加)(含)内容八位字节将指数的值编码为二进制补码二进制数;   的值X应至少有一个;  所发送的指数的1到9位不得全零或全1。”

这是不一致的,如从八比特组‘第三至(X + 3)[RD]’其实X + 1字节。

是任何人都能够澄清这一段?

我认为它应该阅读或者

” ......那么第二个内容八位编码012小于一个八位字节的数目,X说,... “

” ......第三至(X加上2)第二(含)内容字节......”

而且,是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(二进制,0x55​​5555 * 2^-2)

一个例子我不知道的是:

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

另外,好像没有为NaN定义的编码(不是数字)。

回答

2

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

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

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

CO1(东西)CO 2(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和负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) 

所以内容字节#1 1000 = 0111是0×87

内容字节#2 = 0×01(因为中的最小值X是1)

内容字节#3 = 0×00

内容字节#4 = 0×01

内容八位位组#3和#4得到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)不是有效的,CO 2(该X)“应在至少是一个“。但是当我忽略这些约束时,我也会得到你的结果。

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