欢迎关注公众号:冒泡的肥皂
1、简介
AMF(Action Message Format),即操作消息格式,是一种序列化二进制的数据格式。主要用于数据交互和远程过程调用。
2.数据格式
2.1AMF0数据类型
// AMF0数据类型;
AMF_NUMBER = 0x00, // 数字(double);
AMF_BOOLEAN = 0x01, // 布尔;
AMF_STRING = 0x02, // 字符串;
AMF_OBJECT = 0x03, // 对象;
AMF_MOVIECLIP = 0x04, // 保留,未使用;
AMF_NULL = 0x05, // null;
AMF_UNDEFINED = 0x06, // 未定义;
AMF_REFERENCE = 0x07, // 引用;
AMF_ECMA_ARRAY = 0x08, // 数组;
AMF_OBJECT_END = 0x09, // 对象结束;
AMF_STRICT_ARRAY = 0x0a, // 严格的数组;
AMF_DATE = 0x0b, // 日期;
AMF_LONG_STRING = 0x0c, // 长字符串;
AMF_UNSUPPORTED = 0x0d, // 未支持;
AMF_RECORDSET = 0x0e, // 保留,未使用;
AMF_XML_DOC = 0x0f, // xml文档;
AMF_TYPED_OBJECT = 0x10, // 有类型的对象;
AMF_AVMPLUS = 0x11, // 需要扩展到AMF3;
AMF_INVALID = 0xff // 无效的;
2.2AMF3数据类型
AMF3_UNDEFINED = 0x00, // 未定义;
AMF3_NULL = 0x01, // null;
AMF3_FALSE = 0x02, // false;
AMF3_TRUE = 0x03, // true;
AMF3_INTEGER = 0x04, // 数字int;
AMF3_DOUBLE = 0x05, // double;
AMF3_STRING = 0x06, // 字符串;
AMF3_XML_DOC = 0x07, // xml文档;
AMF3_DATE = 0x08, // 日期;
AMF3_ARRAY = 0x09, // 数组;
AMF3_OBJECT = 0x0a, // 对象;
AMF3_XML = 0x0b, // xml;
AMF3_BYTE_ARRAY = 0x0c // 字节数组;
AMF3_DICTIONARY = 0x11
3.AMF0数据解析 错误后续会补充更新
AMF定义中,首先使用一个字节来表示数据类型,可选的核心数据类型如上表。 在数据类型后面紧跟着的就是对应类型数据的长度,每一种类型长度字段所占用的字节数可能也不尽相同。有些没有长度类型的数据类型规定有默认长度。
3.1 Number=0x00
这里指的是double类型,数据用8字节表示
比如十六进制00 40 10 00 00 00 00 00 00
00 类型 后面的是大小端的原因 实际为 10 40
3.2 BOOLEAN = 0x01
Boolean 数据使用1字节表示,使用00表示false,使用01表示true。比如十六进制01 01就表示true。
3.3 STRING = 0x02
String所占用的空间有1个类型标识字节和2个表示字符串UTF8长度的字节加上字符串UTF8格式的内容组成。
比如十六进制03 00 08 73 68 61 6E 67 67 75 61表示的就是字符串,
该字符串长8字节,
字符串内容为73 68 61 6E 67 67 75 61,对应的就是“shanggua”。
3.4 OBJECT = 0x03
Object是Map<String, Object>,内容由UTF8字符串作为Key,其他AMF类型作为Value,
该对象由3个字节:00 00 09来表示结束
3.5 MOVIECLIP = 0x04 未使用
3.6 MOVIECLIP = 0x05 NULL 占一个字节
3.7 MOVIECLIP = 0x06 未定义 占一个字节
3.8 REFERENCE = 0x07 不知道
3.9 ECMA_ARRAY = 0x08
同3 定义了大小 4字节大小(可能有错
3.10 END = 0x09
3.11 ARRAY = 0x0a
首先使用32位整数定义了ArralyList的长度,然后是密集的跟着ArrayList中的对象
3.12 DATE = 0x0b
Date在类型标识符0x0B后使用double来表示从1970/1/1到表示的时间所经过的毫秒数,然后再跟一个ushort的16位无符号整数表示时
3.13 STRING = 0x0c
不过和2对应的String不同的是这里使用32位整数来表示字符串的UTF8长度,而String使用的是16位。
3.14 UNSUPPORTED = 0x0d
如果一个类型不能被序列化或者不支持可以用这个标记
3.15 RECORDSET = 0x0e
不支持,将来可能用 没有将来了
3.16 XML_DOC = 0x0f
XML是使用类型标识符0x0F后直接跟LongString类型的字符串表示
3.17 TYPED_OBJECT = 0x10
如果强类型对象为其类注册了别名,则类型名称也将序列化。类型化对象被视为复杂类型,可以通过引用发送重复实例