AMF目前有两种版本,AMF0和AMF3,他们在数据类型的定义上有细微不同。关于AMF的官方文档参见这里。

Type Byte code Notes
Number 0×00
Boolean 0×01
String 0×02
Object 0×03
MovieClip 0×04 Not available in Remoting
Null 0×05
Undefined 0×06
Reference 0×07
MixedArray 0×08
EndOfObject 0×09 See Object
Array 0x0a
Date 0x0b
LongString 0x0c
Unsupported 0x0d
Recordset 0x0e Remoting, server-to-client only
XML 0x0f
TypedObject (Class instance) 0×10
AMF3 data 0×11 Sent by Flash player 9+

对应的枚举就是:

public enum DataType
{
 Number           = 0x00, // 0
 Boolean          = 0x01, // 1
 String           = 0x02, // 2
 UntypedObject    = 0x03, // 3
 MovieClip        = 0x04, // 4
 Null             = 0x05, // 5
 Undefined        = 0x06, // 6
 ReferencedObject = 0x07, // 7
 MixedArray       = 0x08, // 8
 End              = 0x09, // 9
 Array            = 0x10, // 10
 Date             = 0x11, // 11
 LongString       = 0x12, // 12
 TypeAsObject     = 0x13, // 13
 Recordset        = 0x14, // 14
 Xml              = 0x15, // 15
 TypedObject      = 0x16, // 16
 AMF3data         = 0x17  // 17
}

以上表列出了每种数据类型的表示方法,这样看并不容易理解,下面我就主要讲解一下常用的一些格式:
0.Number这里指的是double类型,数据用8字节表示,比如十六进制00 40 10 00 00 00 00 00 00就表示的是一个double数4.0,在C#中可以使用如下代码读取该数据:

// 这里的顺序是和amf文件中的顺序正好相反,不要忘记了
byte[] d = new byte[] { 0, 0, 0, 0, 0, 0, 0x10, 0x40 };
double num = BitConverter.ToDouble(d, 0);

1.Boolean对应的是.net中的bool类型,数据使用1字节表示,和C语言差不多,使用00表示false,使用01表示true。比如十六进制01 01就表示true。
2.String相当于.net中的string类型,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”。在C#中要读取字符串则使用:

// 03 00 08 73 68 61 6E 67 67 75 61
byte[] buffer = new byte[] { 0x73, 0x68, 0x61, 0x6E, 0x67, 0x67, 0x75, 0x61 };
string str = System.Text.Encoding.UTF8.GetString(buffer);

3.Object在.net中对应的就是Hashtable,内容由UTF8字符串作为Key,其他AMF类型作为Value,该对象由3个字节:00 00 09来表示结束。C#中读取该对象使用如下方法:

private Hashtable ReadUntypedObject()
{
 Hashtable hash = new Hashtable();
 string key = ReadShortString();
 for (byte type = ReadByte(); type != 9; type = ReadByte())
 {
  hash.Add(key, ReadData(type));
  key = ReadShortString();
 }
 return hash;
}

4.MovieClip  Not available in Remoting
5.Null 就是空对象,该对象只占用一个字节,那就是Null对象标识0x05。
6.Undefined 也是只占用一个字节0x06.
7.ReferencedObject  不清楚(可能是类型定义什么的)
8.MixedArray 相当于Hashtable,与3不同的是该对象定义了Hashtable的大小。读取该对象的C#代码是:

private Hashtable ReadDictionary()
{
 int size = ReadInt32();
 Hashtable hash = new Hashtable(size);
 string key = ReadShortString();
 for (byte type = ReadByte(); type != 9; type = ReadByte())
 {
  object value = ReadData(type);
  hash.Add(key, value);
  key = ReadShortString();
 }
 return hash;
}

9.End 查看Object
10.Array对应的就是.net中的ArrayList对象,该对象首先使用32位整数定义了ArralyList的长度,然后是密集的跟着ArrayList中的对象,读取该对象使用如下函数:

private ArrayList ReadArray()
{
 int size = ReadInt32();
 ArrayList arr = new ArrayList(size);
 for (int i = 0; i < size; ++i)
 {
  arr.Add(ReadData(ReadByte()));
 }
 return arr;
}

11.Date 对应.net中的DateTime数据类型,Date在类型标识符0x0B后使用double来表示从1970/1/1到表示的时间所经过的毫秒数,然后再跟一个ushort的16位无符号整数表示时区。读取Date类型的C#代码为:

private DateTime ReadDate()
{
 double ms = ReadDouble();
 DateTime BaseDate = new DateTime(1970, 1, 1);
 DateTime date = BaseDate.AddMilliseconds(ms);
 ReadUInt16(); // get's the timezone
 return date;
}

12.LongString对应的也是string类型,不过和2对应的String不同的是这里使用32位整数来表示字符串的UTF8长度,而String使用的是16位。
13.TypeAsObject
14.Recordset
15.XML是使用类型标识符0x0F后直接跟LongString类型的字符串表示。
16.TypedObject
17.AMF3data

这里大部分代码我都是摘自AMF.net 一个开源的.net AMF序列化和反序列化的库,大家若有兴趣可以到http://sourceforge.net/project/showfiles.php?group_id=159742 去下载。
另外http://osflash.org/documentation/amf/astypes 这个英文网站也对AMF数据类型作了比较详细的介绍。



AMF序列格式详细介绍相关推荐

  1. 什么是TMD格式?TDM格式详细介绍

    什么是TMD格式?TDM格式详细介绍TDM格式 有些IC支持使用一个公共时钟的多路I2S数据输入或输出,但这样的方法显然会增加数据传输所需要的管脚数量.当同一个数据线上传输两个以上通道的数据时,就要使 ...

  2. bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等

    目录 一.概述 二..bmp格式文件详解  2.1 位图文件头  2.2 位图信息头  2.3 调色板  2.4 位图数据 三.位图的其他知识  3.1 压缩的位图 一.概述 bmp是英文Bitmap ...

  3. [网络编程] - MIME格式详细介绍[转]

    来源:http://www.cnblogs.com/robinhood/articles/540464.html Q 什么是MIME?什么是MIME邮件? A MIME, 全称为"Multi ...

  4. MIME格式详细介绍

    Q 什么是MIME?什么是MIME邮件? A MIME, 全称为"Multipurpose Internet Mail Extensions", 比较确切的中文名称为"多 ...

  5. Mysql Binlog三种格式详细介绍

    binlog 的不同模式有什么区别呢? 1.Statement:每一条会修改数据的sql都会记录在binlog中. 优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能.(相比 ...

  6. HTML文档基本格式详细介绍

    HTML基本格式主要包括:<!DOCTYPE>文档类型声明.<html>跟标记.<head>头部标记.<body>主体标记 <!DOCTYPE h ...

  7. FLV流媒体格式详细介绍

    什么是FLV? FLV流媒体格式是一种新的视频格式,全称为Flash Video. [@more@] 它是随着Flash MX的推出发展而来的视频格式,是在sorenson 公司的压缩算法的基础上开发 ...

  8. 前端必备:Javascript 3种书写格式详细介绍

    在网页中编写JavaScript代码时,有3种书写位置,分别是行内式.内嵌式(也称为嵌人式)和外部式(也称为外链式),下面分别进行讲解. 1.行内式 行内式是指将单行或少量的JavaScript代码写 ...

  9. JavaScript的3种书写格式详细介绍

    在网页中编写JavaScript代码时,有3种书写位置,分别是行内式.内嵌式(也称为嵌人式)和外部式(也称为外链式),下面分别进行讲解. 1.行内式 行内式是指将单行或少量的JavaScript代码写 ...

最新文章

  1. 简要叙述计算机软件系统的组成,【计组第一章+答案】概论
  2. Xamarin效果第一篇之时间轴
  3. 78. 子集022(回溯法)
  4. npm i依赖版本兼容问题处理
  5. uri uri_什么是URI? 了解许可证术语以确保合规
  6. Spring Boot和SSM本质上的区别
  7. Microsoft Azure WebSite创建网站
  8. 人物传记——周小川、李稻葵(央行智囊团)
  9. JVM飙高排查脚本-结构分析
  10. java根据坐标轴_java 根据坐标截取图片实例代码
  11. 步进与伺服电机区别与选型
  12. C语言 —— 合并两个有序数组
  13. mysql 中文社区版_mysql数据库下载官网_mysql中文官方网站下载
  14. removeclass 传入两个类_jQuery源码解读之removeClass()方法分析
  15. 【原创】基于JavaWeb的医院预约挂号系统(医院挂号管理系统毕业设计)
  16. 后端知识点链接(二):操作系统、Linux
  17. 第二类曲面积分、场论、高斯公式和斯托克斯公式
  18. Java 17的这些新特性,Java迈入新时代
  19. 如何用p5js做一个可爱的鲶鲶并添加不倒翁效果
  20. 美元汇率Pascal题解

热门文章

  1. 君临天下用计算机怎么弹,君临天下!电脑版教程和按键设置
  2. 单页面与多页面的区别
  3. Binder系列1 Binder总体设计思想
  4. Ubuntu使用有线网卡连接开发板,同时使用无线网卡上网
  5. 百度UE富文本编辑器问题(包问题)JAVA MEAVN
  6. 白宫发布备忘录 停摆期间限制国会议员差旅费
  7. python中return的作用总结
  8. linux ftp服务器匿名登录不能上传解决方法
  9. 前端三剑客的技术介绍
  10. Hadoop之Hive函数