在AS3中另外一个比较涉及底层操作的类是二进制类ByteArray。这个类管理了一系列二进制数据。可以达到在字节层上的控制。二进制数据在网络传输时虽然在工作效率下有所下降,但却是最节省网络带宽的传输方式。
一,简介:
ByteArray输入flash.util包,直接继承自Object对象。具有6个公共属性和33个公共方法。其中大部分是不同数据类型的写入和读取write&read。对ByteArray的操作是基于一个指针position的。
二,公共属性:
1,可用字节数(数组长度)
bytesAvailable : uint
一个只读属性,返回了当前指针position到ByteArray末尾的可读数据长度,避免了读取超出范围的数据而造成的Error。
2,二进制数据格式
defaultObjectEncoding : uint
是一个静态变量,定义了ByteArray的写入或读取数据时使用的格式。通常使用ObjectEncoding来设置,具有三个值AMF0(以AS1,AS2格式序列化对象),AMF3(以AS3格式序列化对象),DEFAULT(按FlashPlayer默认最新的格式序列化对象)。
3,写入字节的顺序
endian : String
也是一个静态变量,定义了字节的顺序。通常使用Endian类设置,具有两个值BIG_ENDIAN(最高有效字节位于字节序列的最前面)和LITTLE_ENDIAN(最低有效字节位于最前),这个主要用于跟服务器端匹配即可。
4,ByteArray长度
length : uint
ByteArray的总长度,以字节为单位。
5,读取格式
objectEncoding : uint
这个就是之前提到的数据写入或读取ByteArray使用的格式,主要还是分AS1,AS2写入还是AS3写入。使用ObjectEncoding来设置。
6,指针位置
position : uint
移动当前读取到ByteArray的位置。
三,公共方法:
其中大部分都是读写方法READ/WRITE,其中READ方法14个,WRITE方法12个(竟然不相同?到时要好好注意)。剩余7个其他方法。
1,构造函数
ByteArray()
没什么特别的,连参数都没有··囧
2,清除
clear():void
清楚ByteArray占用的内存。将长度和position设为0.
3,压缩方法A
compress(algorithm:String):void
参数是一个String类型,通过flash.util.CompressionAlgorithm定义。压缩之后数组变为新长度,position跳到ByteArray末尾。FlashPlayer中运行不能传参数,默认为zlib压缩算法。
4,压缩方法B(AIR only)
deflate():void
另外一种压缩方法,使用的是deflate算法(天知道是什么算法)。压缩之后数组变为新长度,position跳到ByteArray末尾。
5,压缩方法A解压方法
uncompress(algorithm:String):void
解压算法要与压缩算法相对应。FlashPlayer中运行不能传参数,默认为zlib压缩算法。压缩之后数组变为新长度,position跳到ByteArray开头。
6,压缩方法B解压方法(AIR only)
inflate():void
解压通过deflate方法压缩过的ByteArray。压缩之后数组变为新长度,position跳到ByteArray开头。
7,转为字符转方法
toString():String
将ByteArray转化为字符串形似。
接下来就是成对出现的READ/WRITE方法,要注意指针position的位置变化,当位置不足以读取时会引发EOError。
8,读取Boolen值。
readBoolean():Boolean
读取一个字节,当字节不为0时返回true,字节为0时返回false。
9,写入Boolen值。
writeBoolean(value:Boolean):void
当value为true时写入1,当value为false时写入0。
10,读取带符号字节
readByte():int
返回值在-128~127之间,即256个范围(一个字节为8位2进制位)。
11,写入带符号字节
writeByte(value:int):void
参数是一个32位的int整数,只有低8位才会被写入。高24位被忽略。
12,读取字节
readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
第一个参数是将读取出的字节写入第一个参数指定的ByteArray对象中。
后两个即指针position的偏移位置,以及读取的长度(0为从position位置开始全部读取)。
13,写入字节
writeBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
从指定的ByteArray对象bytes中读取一定长度的字节流,写回ByteArray中。
后两个参数定义了位置。
14,读取64位浮点数
readDouble():Number
就是读取一个双精度64位的带小数的浮点数(好绕口,浮点数就是带小数点的意思啊)
15,写入64位浮点数
writeDouble(value:Number):void
将一个64位浮点数写入ByteArray
16,读取32位浮点数
readFloat():Number
读取一个单精度32位的浮点数
17,写入32位浮点数
writeFloat(value:Number):void
将一个32位浮点数写入ByteArray
18,读取带符号整数
readInt():int
从字节流中读出32位带符号整数
19,写入带符号整数
writeInt(value:int):void
将32位带符号整数写入ByteArray
20,从字符集中读取字符串
readMultiByte(length:uint, charSet:String):String
这个字符集不太懂是什么意思,可选的值有"shift-jis","cn-gb"等
21,将多字节按指定字符集形式写入ByteArray
writeMultiByte(value:String, charSet:String):void
与上面的对应。
22,读取对象
readObject():*
从ByteArray中按AMF格式读取一个对象OBJECT
23,写入对象
writeObject(object:*):void
将一个对象写入ByteArray中
24,读取一个16位整数
readShort():int
从ByteArray中读取一个16位带符号的整数
25,写入一个16位整数
writeShort(value:int):void
将一个整数int写入ByteArray中,忽略高16位。
26,读取无符号字节
readUnsignedByte():uint
27,读取无符号16位整数
readUnsignedShort():uint
28,读取无符号32位整数
readUnsignedInt():uint
29,写入无符号32位整数
writeUnsignedInt(value:uint):void
30,读取一个UTF-8字符串
readUTF():String
31,写入一个UTF-8字符串
writeUTF(value:String):void
这个会写在ByteArray里写入一个字节表示字符串长度(16字节),然后再写入字符串
32,读取指定长度的UTF-8字符串
readUTFBytes(length:uint):String
33,写入指定长度的UTF-8字符串
writeUTFBytes(value:String):void
与writeUTF很相似,但是不会自动生成1个字节保存字符串长度
总结:
任何对ByteArray的操作都会引起指针position的变化。其中共有13对读写方法,分别是:Boolen,Byte,Bytes,Double,Float,Int,MulitByte,Object,Short,UnsignInt,UTF,UTFBytes,另外还有2个单独读取的UnsignByte,UnsignShort。
当然具体对ByteArray的操作还要GOOGLE各种文件的格式来进行编码与解码,仅仅一个类并做不了什么。但先对整个类有个整体的了解也是好的。
**********************************************************************
ByteArray 类提供用于优化读取、写入以及处理二进制数据的方法和属性。
注意:ByteArray 类适用于需要在字节层访问数据的高级 ActionScript 开发人员。
内存中的数据是一个压缩字节数组(数据类型的最紧凑表示形式),但可以使用标准 ActionScript []
(数组访问)运算符来操作 ByteArray 类的实例。 也可以使用与 URLStream 和 Socket 类中的方法相类似的方法将它作为内存中的文件进行读取和写入。
此外,还支持 zlib 压缩和解压缩,以及 Action Message Format (AMF) 对象序列化。
ByteArray 类可能的用途包括:
- 创建用以连接到服务器的自定义协议。
- 编写自己的 URLEncoder/URLDecoder。
- 编写自己的 AMF/Remoting 包。
- 通过使用数据类型优化数据的大小。