在AS3中另外一個比較涉及底層操作的類是二進制類ByteArray。這個類管理了一系列二進制數據。可以達到在字節層上的控制。二進制數據在網絡傳輸時雖然在工作效率下有所下降,但卻是最節省網絡帶寬的傳輸方式。
一,簡介:
ByteArray輸入flash.util包,直接繼承自Object對象。具有6個公共屬性和33個公共方法。其中大部分是不同數據類型的寫入和讀取write&read。對ByteArray的操作是基於一個指針position的。
二,公共屬性:
1,可用字節數(數組長度)
一個只讀屬性,返回了當前指針position到ByteArray末尾的可讀數據長度,避免了讀取超出范圍的數據而造成的Error。
2,二進制數據格式
是一個靜態變量,定義了ByteArray的寫入或讀取數據時使用的格式。通常使用ObjectEncoding來設置,具有三個值AMF0(以AS1,AS2格式序列化對象),AMF3(以AS3格式序列化對象),DEFAULT(按FlashPlayer默認最新的格式序列化對象)。
3,寫入字節的順序
也是一個靜態變量,定義了字節的順序。通常使用Endian類設置,具有兩個值BIG_ENDIAN(最高有效字節位於字節序列的最前面)和LITTLE_ENDIAN(最低有效字節位於最前),這個主要用於跟服務器端匹配即可。
4,ByteArray長度
ByteArray的總長度,以字節為單位。
5,讀取格式
這個就是之前提到的數據寫入或讀取ByteArray使用的格式,主要還是分AS1,AS2寫入還是AS3寫入。使用ObjectEncoding來設置。
6,指針位置
移動當前讀取到ByteArray的位置。
三,公共方法:
其中大部分都是讀寫方法READ/WRITE,其中READ方法14個,WRITE方法12個(竟然不相同?到時要好好注意)。剩余7個其他方法。
1,構造函數
沒什么特別的,連參數都沒有··囧
2,清除
清楚ByteArray占用的內存。將長度和position設為0.
3,壓縮方法A
compress(algorithm:String):void
參數是一個String類型,通過flash.util.CompressionAlgorithm定義。壓縮之后數組變為新長度,position跳到ByteArray末尾。FlashPlayer中運行不能傳參數,默認為zlib壓縮算法。
4,壓縮方法B(AIR only)
另外一種壓縮方法,使用的是deflate算法(天知道是什么算法)。壓縮之后數組變為新長度,position跳到ByteArray末尾。
5,壓縮方法A解壓方法
uncompress(algorithm:String):void
解壓算法要與壓縮算法相對應。FlashPlayer中運行不能傳參數,默認為zlib壓縮算法。壓縮之后數組變為新長度,position跳到ByteArray開頭。
6,壓縮方法B解壓方法(AIR only)
解壓通過deflate方法壓縮過的ByteArray。壓縮之后數組變為新長度,position跳到ByteArray開頭。
7,轉為字符轉方法
將ByteArray轉化為字符串形似。
接下來就是成對出現的READ/WRITE方法,要注意指針position的位置變化,當位置不足以讀取時會引發EOError。
8,讀取Boolen值。
讀取一個字節,當字節不為0時返回true,字節為0時返回false。
9,寫入Boolen值。
writeBoolean(value:Boolean):void
當value為true時寫入1,當value為false時寫入0。
10,讀取帶符號字節
返回值在-128~127之間,即256個范圍(一個字節為8位2進制位)。
11,寫入帶符號字節
參數是一個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位浮點數
就是讀取一個雙精度64位的帶小數的浮點數(好繞口,浮點數就是帶小數點的意思啊)
15,寫入64位浮點數
writeDouble(value:Number):void
將一個64位浮點數寫入ByteArray
16,讀取32位浮點數
讀取一個單精度32位的浮點數
17,寫入32位浮點數
writeFloat(value:Number):void
將一個32位浮點數寫入ByteArray
18,讀取帶符號整數
從字節流中讀出32位帶符號整數
19,寫入帶符號整數
將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位整數
從ByteArray中讀取一個16位帶符號的整數
25,寫入一個16位整數
writeShort(value:int):void
將一個整數int寫入ByteArray中,忽略高16位。
26,讀取無符號字節
27,讀取無符號16位整數
28,讀取無符號32位整數
29,寫入無符號32位整數
writeUnsignedInt(value:uint):void
30,讀取一個UTF-8字符串
31,寫入一個UTF-8字符串
這個會寫在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各種文件的格式來進行編碼與解碼,僅僅一個類並做不了什么。但先對整個類有個整體的了解也是好的。