AMQP协议三

8 篇文章 0 订阅

1.2 类型封装

  AMQP封装的数据流是由包含内嵌构造器的非类型化的字节组成的。内嵌的构造器标明是如何解释非类型化的字节的。构造器的功能就是跳过非类型化的字节的终点,然后获取类型对应的值。AMQP封装的数据流开始总是一个构造器。

   constructor                   untyped bytes
         |                                        |
      +--+       +-----------------------+--------------------------+
      |    |        |                                                              |
  ... 0xA1      0x1E   "Hello Glorious Messaging World"   ...
         |         |      |                       |                                |
         |         |      |                utf8 bytes                         |
         |         |      |                                                        |
         |         |    # of data octets                                   |
         |         |                                                               |

         |        +-------------------------+--------------------------+
         |                                         |
         |                    string value encoded according
         |                         to the str8-utf8 encoding
         |
  primitive format code
for the str8-utf8 encoding
                      Figure 1.1: Primitive Format Code (String)

     AMQP的构造器的组成或者是一个基本格式码,或者是一个描述类型格式码。一个基本类型格式码是一个AMQP基本类型的构造器。描述类型格式码由一个描述符和一个基本类型格式码组成。一个描述符定义了怎样从一个AMQP的基本类型中生成一个特定类型。

                  constructor                                 untyped bytes
                          |                                                      |
     +----------------+----------------+  +----------------------+----------------------+
     |                                          |   |                                                        |
...  0x00 0xA1 0x03 "URL" 0xA1   0x1E "http://example.org/hello-world"  ...
             |                         |    |       |                                                        |
             +---------+---------+   |       |                                                        |
                          |                 |       |                                                        |
                  descriptor          |       +----------------------+----------------------+
                                            |                                    |
                                            |            string value encoded according
                                            |                 to the str8-utf8 encoding
                                            |
                           primitive format code
                     for the str8-utf8 encoding
        (Note: this example shows a string-typed descriptor, which should be
considered reserved)
                                  Figure 1.2: Described Format Code (URL)


      描述格式码的描述符部分可以是它自己任意有效的AMQP已封装的值,包括其他描述值。下边给出的是正式的BNF构造器。


                                                constructor = format-code
                                                                   / %x00 descriptor constructor
                                               

                                               format-code = fixed / variable / compound / array
                                                           fixed = empty / fixed-one / fixed-two / fixed-four
                                                                    / fixed-eight / fixed-sixteen
                                                      variable = variable-one / variable-four
                                                  compound = compound-one / compound-four
                                                           array = array-one / array-four

                                                   descriptor = value
                                                          value = constructor untyped-bytes
                                            untyped-bytes = *OCTET ; this is not actually *OCTET, the
                                                                                      ; valid byte sequences are restricted
                                                                                      ; by the constructor

                                                 ; fixed width format codes
                                                         empty = %x40-4E / %x4F %x00-FF
                                                    fixed-one = %x50-5E / %x5F %x00-FF
                                                     fixed-two = %x60-6E / %x6F %x00-FF
                                                    fixed-four = %x70-7E / %x7F %x00-FF
                                                   fixed-eight = %x80-8E / %x8F %x00-FF
                                                fixed-sixteen = %x90-9E / %x9F %x00-FF

                                             ; variable width format codes
                                               variable-one = %xA0-AE / %xAF %x00-FF
                                               variable-four = %xB0-BE / %xBF %x00-FF

                                                 ; compound format codes
                                           compound-one = %xC0-CE / %xCF %x00-FF
                                           compound-four = %xD0-DE / %xDF %x00-FF
          

                                                 ; array format codes
                                                   array-one = %xE0-EE / %xEF %x00-FF
                                                   array-four = %xF0-FE / %xFF %x00-FF

                                                 Figure 1.3: Constructor BNF


         格式码分别对应着四种不同种类的一种:固定宽度,可变宽度,复合数据以及数组数据。每个种类的编码值通过长度共享着相同的基本结构参数。每个格式码中的子类型包含着种类和宽度。

   

      固定宽度  固定宽度数据的大小是由标识固定宽度值的格式码中的子类型来确定的。

      可变宽度  可变宽度数据的大小是由已经封装的数据的前缀的长度决定的。封装好的数据的长度则是由可变宽度值                        的格式码的子类型决定的。

      复合数据  复合数据是被封装成一个长度值加上一个由多态数据组成的数据序列的计数值。序列中的每个值之前都                        会有一个构造器,这个构造器表明封装的值的语法及封装的数据。 其中长度值和计数值是由复合数据                          值的格式码的子类型来确定的。

      数组数据    数组数据被封装成一个长度值和计数值,其中计数值后紧跟着是每个数组元素的构造器,紧跟构造器                          后的是根据数组元素的构造器封装的数据的一个单一的序列的。长度值和计数值的宽度大小是由数组的                        格式码的子类型来确定的。                       


      每个格式码对应的每一位依据下边的层次结构描述:

      Bit: 7       6       5     4    3    2    1    0
            +---------------------------------------+ +------------+
            |   subcategory    |    subtype    |  | ext-type |
           +----------------------------------------+ +------------+
                               1 octet                          1 octet
           |                                                                     |
           +--------------------------------------------------------+
                                             |
                                   format-code
           ext-type: 只有在subtype的值为0xF时才有


      下边的表描述了格式码的子类型:

       Subcategory     Category                   Format
       ==============================================================================
              0x4             固定宽度数               0字节数
              0x5             固定宽度数               1字节数
              0x6             固定宽度数               2字节数
              0x7             固定宽度数               4字节数
              0x8             固定宽度数               8字节数
              0x9             固定宽度数               16字节数

              0xA             可变宽度数               1字节长度值+0到255长度字节数 
              0xB             可变宽度数               4字节长度值+0到4294967295长度字节数
              0xC             复合数据                  1字节的长度值和计数值+0到255长度字节数
              0xD             复合数据                  4字节的长度值和计数值+0到4294967295长度字节数
              0xE             数组数据                  1字节的长度值和计数值+0到255长度的相同类型的字节数
              0xF             数组数据                  4字节的长度值和计数值+0到4294967295长度的相同类型的字节数

    需要注意的是,如果不是特殊说明,AMQP编码使用的都是网络序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值