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的资源.

   
   
  1. var bytes:ByteArray = new ByteArray();  
  2. bytes.writeInt(10); // length = 4  
  3. bytes.length = 0;   // 仅截短bytes,并不释放资源  
  4. bytes.length = 4;   // 重新设置bytes为4个字节  
  5. bytes.position = 0;  
  6. trace(bytes.readInt());// 10  
  7.    
  8. bytes.clear();      // 释放资源,并设置length = 0  
  9. bytes.position = 0;  
  10. bytes.length = 4;   // 重新设置bytes为4个字节  
  11. 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个字节表示).

 

  1. var bytes:ByteArray = new ByteArray();  
  2. bytes.writeUTF("123");  
  3. showBytes(bytes); // bytes: 0x0 0x3 0x31 0x32 0x33         (0x0,0x3  两个字节的头,表示后面有3个字节的字节流, 0x31:1, 0x32:2, 0x33:3)  
  4. bytes.length = 0;  
  5. bytes.position = 0;  
  6. bytes.writeUTF("我是lite3");  
  7. trace(bytes.length); // 13      头(2个字节) + 2个汉字(6个字节) + 5个字母数字(5个字节)  
  8.    
  9. function showBytes(bytes:ByteArray):void  
  10. {  
  11.     var s:String = "";  
  12.     bytes.position = 0;  
  13.     while (bytes.bytesAvailable)  
  14.     {  
  15.         s += "0x" + bytes.readByte().toString(16) + " ";  
  16.     }  
  17.     if (s.length > 0) s = s.substr(0, s.length - 1);  
  18.     trace("bytes:", s);  
  19. }  
 

 

readUTFBytes(length:uint):String
writeUTFBytes(value:String):void
跟readUTF,writeUTF不同,不用两个字节的head,直接存取字符串字节流, Java默认也用这种格式.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值