AMF解析(四)

来源:互联网 发布:皇冠娱乐系统源码搭建 编辑:程序博客网 时间:2024/06/11 03:42
 
今天我们最后再读下Array与byteArray这两种类型的解析,有了上次Object的解析方法,这次就简单了。
Array(readArray):关于Array我们也分两种情况,因为Array继承自Object,所以也具有动态赋值的特性。首先,我们讲具有正常下标的数组。
1、有以下AS代码:
       var arr:Array = new Array("aaa","bbb");
我们将其写入ByteArray后变成二进制={9,5,1,6,7,97,97,97,6,7,98,98,98}
首先,第1个字节9很简单,当然表示Array类型了,接下来我们再读取一个int,即ref=5,由于Array为对象型,所以前面讲过,只要是对象型,都要判断前面是否已经发送过,那么我们以如下来判断:
if(ref & 1 == 0) 则第ref>>1次发送过
else 这个数组的长度是len = ref >> 1
然后,我们再读取一个String,至于为什么要读取String我们等下再讲,这里我们要判断下,如果读到的String是空,则结束读取String。那么我们读到1后,可以判断String是空的,所以停止读取String。
最后,我们便要根据上面数组的长度,进行循环读取值了。{6,7,97,97,97,6,7,98,98,98},循环两次,6表示是值的类型,就是2个String了。注意,这里可以是其他类型,比如自定义类型都要吧,只要调用readObject方法就行了。
接下来我们再来看下,由于Array继承Object,所以可以以键值对的方式出现。
2、以下AS代码:
       var arr:Array = new Array("aaa","bbb");
       arr["name"] = "yokia";
利用AMF变成二进制={9,5,9,110,97,109,101,6,11,121,111,107,105,97,1,6,7,97,97,97,6,7,98,98,98}
首先,第1个字节9与5跟上面意思相同也表示类型与长度len=2。这里长度为什么是2,不是3吗?我们有必要解释下,这里的长度是指,按正常数组下标的长度,并不算那些动态赋值的,所以这里是2。
我们先读取动态赋值的数组,当然要读key值先了,{9,110,97,109,101}读取String后变成"name",再读取Object,即调用readObject()方法,{6,11,121,111,107,105,97}变成成"yokia"。我们循环读取String-Object,值到String为空。{1}读取后,String便是空的了。所以停止。
接下来,我们就根据数组长度,来循环读取下面的值了。{6,7,97,97,97,6,7,98,98,98}读取后,变成了"aaa"与"bbb"两个字符,这两个字符便是我们数组里的值。
以上两种方法,我们就把Array解析完了。
 
ByteArray(readByteArray):字节数组解析起来就更简单了,因为从流中读取过来,本来就是字节了,所以后面的不需要额外的解析,只要解析头就行了。假设,我们将一个长度为9的字节利用AMF格式变成二进制={12,19,0,0,0,10,0,3,97,97,97},第1个字节12表示类型,由于ByteArray也是对象,所以再读取一个int ref=19,表示是否发送过,我们知道并未发送,再将ref>>1就表示字节的长度了,然后根据长度将剩余的字节读过来就行了,由于全是字节,所以不需要额外转换,只要读取便好。
原创粉丝点击