现在的位置: 首页 > 综合 > 正文

as3 ByteArray 之 readBytes

2013年09月15日 ⁄ 综合 ⁄ 共 1882字 ⁄ 字号 评论关闭

这个方法相当的神奇——

 

首先,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 ?--------------------------");
		}

 

 

 

抱歉!评论已关闭.