AMF数据类型详解
一、AMF格式定义
类型说明(ObjType) | 具体值 | ObjValueSize |
CORE_NUMBER | 0x00 | 8字节 |
CORE_BOOLEAN | 0x01 | 1字节 |
CORE_String | 0x02 | 2字节 (2字节的数据纪录了String的实际长度) |
CORE_Object | 0x03 | 0字节(开始嵌套0x000009表示嵌套结束) |
NULL | 0x05 | 0字节 空字节无意义 |
CORE_Map | 0x08 | 4字节(开始嵌套) |
二、具体定义及其举例
1、number类型
类型0x00(1byte)+值(8bytes)
例如:00 3f f0 00 00 00 00 00 00
number类型:0x00
number值:3f f0 00 00 00 00 00 00 (为小端存储)
在解number的值的时候要先正过来才求值,注意:这个值是double类型的。
C#方式求解:
byte[] data = new byte[]{0x3f, 0xf0, 0x00, 0x00 , 0x00 , 0x00 , 0x00 , 0x00};
double value = BitConverter.ToDouble(data.Reverse().ToArray(), 0);
2、bool类型
类型0x01(1byte)+值(1byte)
例如:01 01
类型:0x01
值 :0x01(true),0x00(false)
3、string类型
类型0x02(1byte)+长度(2bytes)+值(前面指定长度的bytes)
例如:02 00 07 63 6f 6e 6e 65 63 74
类型:0x02
长度:0x00 0x07(大端存储)
值 :0x63 ,0x6f ,0x6e ,0x6e ,0x65 ,0x63 ,0x74 (大端存储)
C#方式求解:
byte[] data = new byte[]{0x63 ,0x6f ,0x6e ,0x6e ,0x65 ,0x63 ,0x74};
string value = Encoding.UTF8.GetString(data)
4、null类型
类型0x05(1byte)
例如:05
类型:0x05
null类型很特殊就一个字节0x05
5、object类型
例如:
object类型有三部分组成,
类型0x03(1byte)
第一部分是Property:Property结构(默认string类型省略0x02):长度(2bytes)+值(前面指定长度bytes)
第二部分是value:value结构:可以是以上说明的任意类型。
第三部分是结尾:00 00 09
例如:00 03 61 70 70 02 00 09 6c 69 76 65 2f 31 32 33 34
Property长度:00 03
Property值: 61 70 70 “app”
value类型: 02
value长度: 00 09
value值: 6c 69 76 65 2f 31 32 33 34 “live/1234”
6、map类型
该类型是出现在object下的一个参数data中, 格式如下不再赘述了
7、注意Rtmp数据中的坑
在Wireshark抓包中会出现一个特殊的字节C3
这个是AMF0消息中的Connect,但是在TCP payload中会多出一个C3(这个字节是是客户端发送Connect命令的时候会多出的一个字节)
但是在Wireshark解析中会自动过滤掉这个字节,如下图:
建议:在解析rtmp数据的时候不要一味地看Wireshark解析,要学会从TCP payload的实际数据中解析数据。