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也是如此。
- read方法時有時會有報Error: Error #2030: 遇到文件尾。錯誤.
數值存取:
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默認也用這種格式.