Показать сообщение отдельно
Старый 06.11.2012, 19:16
rolling_kz вне форума Посмотреть профиль Отправить личное сообщение для rolling_kz Найти все сообщения от rolling_kz
  № 9  
Ответить с цитированием
rolling_kz

Регистрация: Nov 2012
Сообщений: 14
у создателя спросил - молчит.

я не совсем гуру. уйдет очень много времени.
спросил вдруг в в этом алгоритме кто-то заметит где ошибка:

Код AS3:
/*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @license FREEWARE
* @copyright (c) 2003 sephiroth.it
*
* SerializerClass is the base class for retreiving complex data type
* from and to PHP pages using the built-in serializer/unserializer
* php functions
* Thanks to Rainer Becker [rainer.becker@pixelmotive.de] for the string bug fixing
* Gavril Tarasoff for PHP5 stdObject addition
*
* @project : serializer
* @file :    Serializer
* @author :  Alessandro Crugnola- alessandro@sephiroth.it/ www.sephiroth.it
* @version  $Id: Serializer.as,v 1.19 2006/04/19 08:37:45 sephiroth_tmm Exp $
*
*/
package 
{
	import mx.core.*;
	use namespace mx_internal;
 
	/**
	 * Serializer enable you to pass and receive complex data type from/to PHP/Flash using the native PHP functions serialize and unserialize.
	 * Flash received data will be a native Flash object too.
	 * 
	 * @author alessandro crugnola (alessandro@sephiroth.it)
	 * @version 3.0.0
	 * @url http://www.sephiroth.it/test/unserializer
	 */	
	public class Serializer extends Object
	{
		public static const version:String = "3.0.0";
 
		mx_internal static var c:uint;
		mx_internal static var pattern:RegExp = /[A-Z][a-z]{2}, \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2} \+|\-\d{4}/g
 
		/**
		 * Serialize an input data into a PHP readable string
		 * which can be send through get or post and deserialized
		 * into the starting object
		 * 
		 * @param data
		 * @return the serialized string
		 * @example
		 * 
		 * <pre>
		 * var o:Object = {first:1, second:[1,2,3,4]};
		 * var result:String = Serializer.serialize(o);
		 * </pre>
		 */
		public static function serialize(data:*):String
		{
			var s:String;
			var tmp:Array = new Array();
			var i:int = 0;
			var key:String;
 
			if(data is Boolean){
				s = "b:"+uint(data)+";";
			} else if(data is int){
				s = "i:"+data.toString()+";";
			} else if(data is Number){
				s = "d:"+data.toString()+";";
			} else if(data is String){
				s = "s:"+Serializer.stringLength(data)+":\""+data+"\";"
			} else if(data is Date){
				s = "s:" + data.toString().length + ":\"" + data + "\";"
			} else if(data is Object){
				for(key in data){
					tmp.push(Serializer.serialize(key));
					tmp.push(Serializer.serialize(data[key]));
					i += 1;
				}
				s = "O:8:\"stdClass\":" + i + ":{" + tmp.join("") + "}";
			} else if(data is Array){
				for(key in data){
					tmp.push(Serializer.serialize(i))
					tmp.push(Serializer.serialize(data[key]))
					i += 1
				}
				s = "a:"+i+":{"+ tmp.join("") + "}";
			} else if(data == null || data == undefined){
				s = "N;";
			} else {
				s = "i:0;"
			}
			return s;
		}
 
		/**
		 * unserialize PHP serialized string into a
		 * readable Flash object
		 * @param data serialized string
		 * @return type depends on the content of serialized string
		 * 
		 * @example
		 *  <pre>
		 *	import flash.net.*;
		 *	import org.sepy.io.Serializer;
		 * 
		 *	private var req:URLRequest;
		 *	private var loader:URLLoader;
		 * 
		 *	private function init():void
		 *	{
		 *		req = new URLRequest("http://localhost/serializer/unserializer.php?getvalue");
		 *		loader = new URLLoader(req);
		 *		loader.addEventListener(Event.COMPLETE, handler);
		 *		loader.dataFormat = URLLoaderDataFormat.VARIABLES;
		 *		loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, handler);
		 *	}
		 *	 
		 *	private function handler(e:Event):void
		 *	{
		 *		if(e.type == Event.COMPLETE)
		 *		{
		 *			var res:String = URLLoader(e.target).data.result
		 *			var data:* = Serializer.unserialize(res);
		 *			trace(data);
		 *		}
		 *	}
		 * 
		 *  init();
		 * 
		 *  </pre>
		 */		
		public static function unserialize(data:String):*
		{
			Serializer.c = 0;
			return Serializer.unserialize_internal(data);
		}
 
 
		mx_internal static function unserialize_internal(data:String):*
		{
			var result:*;
			var tmpvar:*;
			var tmp:Array = new Array();
			var type:String = data.charAt(Serializer.c);
			var pos:uint = 0;
			var islist:Boolean = true;
			var i:uint;
 
			switch(type){
				case "N":
					Serializer.c += 2;
					break;
				case "b":
					result = data.substr(Serializer.c+2, 1) == "1"
					Serializer.c += 4
					break;
				case "i":
					tmp.push(data.indexOf(";", Serializer.c))
					pos = Serializer.c+2
					Serializer.c = tmp[0]+1
					result = int(data.substring(pos,tmp[0]))
					break;
				case "d":
					tmp.push(data.indexOf(";", Serializer.c))
					pos = Serializer.c + 2
					Serializer.c = tmp[0]+1
					result = Number(data.substring(pos,tmp[0]))
					break;
				case "s":
					tmp.push(int(data.indexOf(":", Serializer.c+2)))
					tmp.push(tmp[0]+2)
					pos = Serializer.c+2
					tmp.push(0)
					tmp.push(int(data.substring(pos, tmp[0])))
					if(tmp[3] == 0)
					{
						result = "";
						Serializer.c = pos+5
					} else {
						var lenc:uint = Serializer.stringCLenght(data, Serializer.c, tmp[3]);
						if(lenc != tmp[3])
						{
							result = data.substr(tmp[0]+2, lenc);
							Serializer.c = tmp[0]+4+lenc;
						} else {
							result = data.substr(tmp[0]+2, tmp[3]);
							Serializer.c = tmp[0]+4+tmp[3];
						}
					}
					if(Serializer.pattern.test(result))
					{
						result = new Date(result)
					}
					break;
				case "a":
					pos = Serializer.c+2
					tmp.push(int(data.indexOf(":", pos)))
					tmp.push(int(data.substring(pos, tmp[0])))
					Serializer.c = tmp[0]+2
					result = []
					for(i = 0; i < tmp[1]; i++){
						tmpvar = Serializer.unserialize_internal(data)
						result[tmpvar] = Serializer.unserialize_internal(data)
						if(!(tmpvar is int) || tmpvar < 0){
							islist = false
						}
					}
					if(islist){
						tmp.push([])
						for(var key:uint = 0; key < result.length; key++){
							pos = tmp[2].length
							while(key > pos){
								tmp[2].push(null)
								pos +=1
							}
							tmp[2].push(result[key])
						}
						result = tmp[2]
					}
					Serializer.c += 1
					break;
				case "O":
					pos = data.indexOf("\"", Serializer.c)+1;
					Serializer.c =  data.indexOf("\"", pos);
					tmp.push(data.substring(pos, Serializer.c))
					Serializer.c += 2
					i = Serializer.c
					Serializer.c = data.indexOf(":", i)
					i = int(data.substring(i, Serializer.c))
					Serializer.c +=2;
					result = {};
					var tmps:*;
					while(i > 0){
						tmps = Serializer.unserialize_internal(data)
						result[tmps] = Serializer.unserialize_internal(data)
						i -= 1
					}
					break;
			}
			return result;
		}
 
 
		mx_internal static function stringCLenght(data:String, from:uint = 0, len:uint = 0):int
		{
			var i:uint;
			var j:uint = len;
			var startIndex:uint = from + 4 + len.toString().length;
			for (i = 0; i < j; i++){
				if (data.charCodeAt(i+startIndex) > 128)
				{
					j = j - 1
				}
			}
			return j;
		}
 
		mx_internal static function stringLength(data:String):uint
		{
			var code:int   = 0
			var result:int = 0
			var slen:int   = data.length;
			while(slen){
				slen = slen - 1
				try
				{
					code = data.charCodeAt(slen)
				} catch(e:Error){
					code = 65536
				}
				if(code < 128){
					result = result + 1
				} else if(code < 2048){
					result = result + 2
				} else if(code < 65536){
					result = result + 3
				} else {
					result = result + 4
				}
			}
			return result
		}
 
	}
}