00000000 00 03 00 00 00 01 00 1d 45 78 61 6d 70 6c 65 53 ExampleS 00000010 65 72 76 69 63 65 2f 72 65 74 75 72 6e 4f 6e 65 ervice/returnOne 00000020 50 61 72 61 6d 00 02 2f 31 00 00 00 3d 0a 00 00 Param /1 = 00000030 00 01 11 0a 0b 0d 6d 79 54 79 70 65 11 61 72 72 myType arr 00000040 61 79 56 61 6c 09 07 01 04 01 04 02 06 07 65 72 ayVal er 00000050 74 13 73 74 72 69 6e 67 56 61 6c 06 07 62 6c 61 t stringVal bla 00000060 0d 69 6e 74 56 61 6c 04 02 intVal
这里注意一个问题,AMF 数据打包是按照 AMF 0 标准来打包的,因此虽然头部版本号是 00 03,头部和消息的数据体依然是默认按 AMF 0 来开始解析,直到你遇到了类型为 11 (十进制 17 )的类型标记,以它标记的数据才是 AMF 3 格式的。咱们以上面的数据内容作一下人工解析: 数组
0a 00 00 00 01 11 0a 0b 0d 6d 79 54 79 70 65 11 61 72 72 61 79 56 61 6c 09 07 01 04 01 04 02 06 07 65 72 74 13 73 74 72 69 6e 67 56 61 6c 06 07 62 6c 61 0d 69 6e 74 56 61 6c 04 02
AMF 格式的数据类型分为两种,一种是 AMF 0 规定的数据类型,另外一种就是 AMF 3 规定的数据类型。它们之间是经过 AMF0 中一个特殊的类型 0x11 (类型编码为 17)来进行转换的。也就是说,在按 AMF 0 解析内容时,若是遇到类型的编码为 0x11 的项目,那就说明这个项目是 AMF3 格式的对象了,咱们须要按 AMF 3 格式对其内容进行解析。编码
先看 AMF 0 的数据类型( 2006 版):spa
再看 AMF 3 的类型( 2013 版):3d
为啥 AMF3 会有两个 XML 支持,这个问 Adobe 去,反正不是我规定的。每一个 AMF 格式的数据实际上都是有一个一个字节的类型标志开始,后跟这个类型格式约定的具体值。code
一、双精度浮点数视频
类型编号:0对象
格式:IEEE-754 的8字节 BE 编码索引
二、布尔ip
类型编号:1文档
格式:单字节
备注:0 为 false,其它值为 true
三、字符串
类型编号:2
格式:[字符串长度][字符串内容]
备注:字符串长度为两个字节的 WORD 类型(BE编码),字符串内容是 UTF-8 编码
四、对象类型
类型编号:3
格式:[[属性名称][对象结束类型标记|属性值]]…
备注:首先是第一个属性的名称,而后是属性的值或者对象结束标记(09),若是遇到对象结束标记,则对象属性定义结束。
五、视频剪辑
类型编号:4
格式:官方未提供支持
六、NULL 类型
类型编号:5
格式:无附加内容
七、未定义类型(Undefined)
类型编号:6
格式:无附加内容
八、引用类型
类型编号:7
格式:引用的复合类型索引(匿名对象、特定类型对象、数组或混合数组,BE编码)
九、复合数组
类型编号:8
格式:[元素数量][元素*元素数量]
备注:元素数量为32位无符号整数,后面跟每个元素的定义
十、对象结束
类型编号:9
格式:00 00
备注:能够认为是长度为 0 的 UTF8 字符串,应用于对象和数组等复合类型
十一、严格数组
类型编号:10
格式:[元素数量][元素*元素数量]
备注:元素数量为 32 位无符号整数,后面跟每一个元素的定义,与复合数组不一样,它没有额外的索引内容
十二、日期类型
类型编号:11
格式:[日期值][00 00]
备注:日期值为1970-1-1 午夜开始的毫秒数,类型为双精度浮点数(BE 编码)
1三、长字符串
类型编号:12
格式:[字符串长度][字符串内容]
备注:字符串长度为 32 位整数,后跟对应长度的 UTF-8 字符串内容
1四、不支持的类型
类型编号:13
格式:官方未提供支持
1五、数据集类型
类型编号:14
格式:官方未提供支持
1六、XML
类型编号:15
格式:[内容长度][内容]
备注:内容长度为 32 位整数,后跟对应长度的 UTF-8 格式内容
1七、特定类型对象
类型编号:16
格式:[类型名称][对象类型-对象值]*
备注:
1八、AMF 3 对象
类型编号:17
格式:[AMF 3 数据类型定义]
备注:这个类型定义到对象类型定义结束,都是 AMF 3 格式。