AS3.0 ByteArray詳解


最近學習做socket, 當然就用到ByteArray了,一起學習一下吧。

objectEncoding: 設置ByteArray讀寫Object是編碼格式, 僅對writeObject,readObject這兩個方法有用.
endian:指示多字節數字的最高有效字節位於字節序列的最前面。 一般不用設置, 默認是Endian.BIG_ENDIAN.

 

bytesAvailable, length, position
這3個屬性是相關的.
position:ByteArray的當前讀寫點, 可讀寫. (當然length == 1, 設置position = 5, 這樣也不會報錯)
bytesAvailable:ByteArray當前可讀取的字節數,只讀.
length:ByteArray 的總字節數, 可讀寫. (如果設置的值比實際的小,則截短ByteArray,但不釋放, 否則在右側用0填充)
如果position不越界,那么bytesAvailable == length - position;

clear():void:釋放ByteArray的資源,並設置length=0,(position不變).
length 也可以顯示的設置為0, 但 length=0 不釋放ByteArray的資源.

 

var bytes:ByteArray = new ByteArray();
bytes.writeInt(10); // length = 4
bytes.length = 0; // 僅截短bytes,並不釋放資源
bytes.length = 4; // 重新設置bytes為4個字節
bytes.position = 0;
trace(bytes.readInt());// 10

bytes.clear(); // 釋放資源,並設置length = 0
bytes.position = 0;
bytes.length = 4; // 重新設置bytes為4個字節
trace(bytes.readInt());// 0

read,write方法:

    • read方法時有時會有報Error: Error #2030: 遇到文件尾。錯誤.
      因為所要讀取的字節數不足, 比如bytesAvailable<4,卻要讀4個字節(例如:readInt).
    • read,write 方法都是按字節存取的,即便是readBoolean,writeBoolean也是如此。

數值存取:
readBoolean, writeBoolean ,readByte,writeByte等..以下簡稱 Boolean,Byte等...
占用字節數1: Boolean,Byte,UnsignedByte (因為是以byte為單位存取,所要Boolean也占用一個字節)
占用字節數2: Short,UnsignedShort
占用字節數4: Int,Float,UnsignedInt
占用字節數8: Double
Unsigned 表示無符號類型,僅表示正數, 否則為有符號,可表示正負數.

二進制存取:
byteArray.readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
從byteArray的byteArray.position開始,讀取length個字節放到bytes里,bytes從offset開始放.(bytes的position不變,bytesArray的position增加)
byteArray.writeBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
從bytes的offset開始,讀取length個字節放到byteArray里,byteArray從byteArray.position開始放. (bytes的position不變, byteArray的position增加)
總結: byteArray都是從byteArray.position開始(不論讀寫), bytes都是從offset開始(不論讀寫).

對象存取:
readObject,writeObject 用於直接存取 AS對象.應用AMF格式 反序列化從字節數組(序列化到字節數組).

字符串存取:
readMultiByte(length:uint, charSet:String):String
writeMultiByte(value:String, charSet:String):void
根據不同的編碼存取字符串.
readUTF():String
writeUTF(value:String):void
這個格式分兩部分: head + body
head:一個16為的整數表示之后字符串的字節數.
body:字符串的字節流. (這里的漢字用3個字節表示).

var bytes:ByteArray = new ByteArray();
bytes.writeUTF("123");
showBytes(bytes); // bytes: 0x0 0x3 0x31 0x32 0x33 (0x0,0x3 兩個字節的頭,表示后面有3個字節的字節流, 0x31:1, 0x32:2, 0x33:3)
bytes.length = 0;
bytes.position = 0;
bytes.writeUTF("我是lite3");
trace(bytes.length); // 13 頭(2個字節) + 2個漢字(6個字節) + 5個字母數字(5個字節)

function showBytes(bytes:ByteArray):void
{
var s:String = "";
bytes.position = 0;
while (bytes.bytesAvailable)
{
s += "0x" + bytes.readByte().toString(16) + " ";
}
if (s.length > 0) s = s.substr(0, s.length - 1);
trace("bytes:", s);
}

readUTFBytes(length:uint):String
writeUTFBytes(value:String):void
跟readUTF,writeUTF不同,不用兩個字節的head,直接存取字符串字節流, Java默認也用這種格式.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM