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编码使用的都是网络序。