使用BER对ASN.1 REAL进行编码和解码

时间:2015-01-27 08:37:04

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

请原谅我的英语不好。我在十进制系统中有一个数字: 0.15625

(这是示例)http://www.strozhevsky.com/free_docs/asn1_in_simple_words.pdf(第5页)

根据BER ASN.1的规则 - 以八进制编码: 09 03 90 FE 0A (这是正确的决定)

http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf - 标准ASN.1(8.5 - REAL)

1个字节:

(8-7) Class - Universal - 00 
(6) P/C - Primitive - 0
(5-1) Tag Number - 01001(REAL)

TOTAL:00001001(2)= 09(16)(正确)

2字节:

     (8) binary encoding - 1
      _____________________
     (7) When binary encoding is used (bit 8 = 1), then if the mantissa M is 
         non-zero, it shall be represented by a sign S, a positive integer value N 
         and a binary scaling factor F, such that:
            M = S × N × 2F
         Bit 7 of the first contents octets shall be 1 if S is –1 and 0 otherwise. 
         What I would have bit 7?
        _____________________
     (6-5) base 8 - 01
       _______________________
     (3-4) Bits 4 to 3 of the first contents octet shall encode the value of
     the binary scaling factor F as an unsigned binary
     integer. I don't have scaling factor. - 00
      _____________________
     (2-1) 8.5.6.4 Bits 2 to 1 of the first contents octet shall encode 
     the format of the exponent as follows: I do not know how to determine 
     what my value will be here. (Poor understand English). I think 11?

总计:1?010011 - NOT EQUAL 03 为什么? (不正确)

90 是什么?打电话给八重奏?怎么找到它?这本书没有说,或者我根本就不明白。

FE 编号-2(指数)中,如何翻译 FE ,而不是获得254和-2?也许它包含有关字节的信息: 90

感谢您的聆听。

1 个答案:

答案 0 :(得分:3)

在"第1章中.ASN.1编码的通用规则"它声明编码有三个部分:

  1. 信息块
  2. 长度块
  3. 一个价值块
  4. 长度块指定值块的长度。

    0.15625的编码为八位字节09 03 80 FB 05,如下所示:

    09       - information block (1 octet)
    03       - length block (1 octet)
    80 FB 05 - value block (3 octets)
    

    值块本身由三部分组成:信息八位字节,指数块和尾数块。在这种情况下,尾数是M = 5(基数为2的101),指数是E = -5。因此,值块为:

    80       - information octet
    FB       - the exponent block (FB = -5)
    05       - the mantissa block (5)
    

    信息八位字节指定各种信息,包括:

    • 我们正在编码实数
    • 我们在基地2中使用,
    • 该数字为非负数(> = 0)

    要回答关于FE被解释为-2的问题,这就是2s-补码算术(more info)中负数的表示方式。对于单个八位字节数字,我们有:

    FF   ->  -1
    FE   ->  -2
    FD   ->  -3
    ...
    80   ->  -128
    7F   ->  +127
    7E   ->  +126