这个方法相当的神奇——
首先,readInt readUTF都是直接返回相应类型的数据,而这个方法却要你传入一个变量进去。
其次,这个方法很难从他的定义去理解,官方的文档:
public function readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void 语言版本: ActionScript 3.0 运行时版本: AIR 1.0, Flash Player 9, Flash Lite 4 从字节流中读取 length 参数指定的数据字节数。从 offset 指定的位置开始,将字节读入 bytes 参数指定的 ByteArray 对象中,并将字节写入目标 ByteArray 中。
“从字节流中读取 length 参数指定的数据字节数。从 offset 指定的位置开始,将字节读入 bytes 参数指定的 ByteArray 对象中,并将字节写入目标 ByteArray 中。”
这个解释有如下歧义:
1 有两个字节流:1调用此方法的字节流,2传入的第一个参数;究竟是从谁读入谁?
按照通常的理解当然是调用方法的字节流是来源——但事实却不是。
2 offset是谁的offset,一般理解来是源字节流的offset,——但事实却也不是。
这两个坑可是把我坑惨了,
正确的解释应该是(源自好心网友):
上海|lite3(73548607*) 18:07:11 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开始(不论读写). http://www.litefeel.com/bytearray-api-explanation/ 看看API
附一段把一个长bytearray分段发送的代码:
var tmp:ByteArray = new ByteArray(); private function sendASection():void{ if(d.bytesAvailable>0){ try{ tmp = new ByteArray (); tmp.clear(); tmp.position = 0; var read_length = d.bytesAvailable>per?per:d.bytesAvailable; trace(read_total +","+ read_length); d.readBytes(tmp, 0, read_length); tmp.position = 0; read_total+=tmp.length; trace( "progressHandler d.position:" + (d.position)+", current sent: "+tmp.bytesAvailable+"-"+ tmp.length+"/"+read_length+ ", left: "+ d.bytesAvailable + ", total_length=" + total_length ); socket.writeBytes(tmp as ByteArray); socket.flush(); if (this.uploadProgressHandler) { //this.uploadProgressHandler try{ ExternalInterface.call(this.uploadProgressHandler, d.position, total_length); }catch(e){ trace(e) } } //if(tmp.length<per) break; }catch(e){ this.debug(e); //break; } }else trace("----------------------DONE ?--------------------------"); }