erlang与as3 socket解析

这个解析类是我现在项目中用到的一个as3erlang sokcet通信的一个类。 解析出来的数据是数组。
本想做成object的, 不过这得服务器那边配合. 服务器这边的工作量就会加大了, 因为每一个值都要加一个元素符这样才能构成object基本的组成元素。
我们的做法是:服务端那边返回的数据,在协作平台上把数据元素列出来, 前端做开发就参考这个数据列表来做开发 。

BertClass.as
文件定义一些字头类型

  1. package app.model.comsocket.comParse { 

  2. /** 

  3. * 字节头类型 

  4. * @author zl-主程 

  5. */ 

  6. public class BertClass{ 

  7.      public static const BERT_START:String = String.fromCharCode(131); 

  8.      public static const SMALL_ATOM:String = String.fromCharCode(115); 

  9.      public static const ATOM:String = String.fromCharCode(100); 

  10.      public static const BINARY:String = String.fromCharCode(109); 

  11.      public static const SMALL_INTEGER:String = String.fromCharCode(97); 

  12.      public static const INTEGER:String = String.fromCharCode(98); 

  13.      public static const SMALL_BIG:String = String.fromCharCode(110); 

  14.      public static const LARGE_BIG:String = String.fromCharCode(111); 

  15.      public static const FLOAT:String = String.fromCharCode(99); 

  16.      public static const STRING:String = String.fromCharCode(107); 

  17.      public static const LIST:String = String.fromCharCode(108); 

  18.      public static const SMALL_TUPLE:String = String.fromCharCode(104); 

  19.      public static const LARGE_TUPLE:String = String.fromCharCode(105); 

  20.      public static const NIL:String = String.fromCharCode(106); 

  21.      public static const ZERO:String = String.fromCharCode(0); 





  22. }

 

ParseSocketData.as 解析erlang神发送的二进制和发送数据给erlang


 

  1. package app.model.comsocket.comParse { 

  2. import app.utility.debug.Debug; 

  3. import flash.display.Sprite; 

  4. import flash.utils.ByteArray; 

  5. /** 

  6. * @author silva-主程 

  7. */ 

  8. public class ParseSocketData extends Sprite { 

  9.      public static function bytes_to_string(arr:ByteArray):String { 

  10.          var str:String = ";";; 

  11.          var len:int = arr.length; 

  12.        //Debug.log(";len:"; + arr.length); 


  13.        for (var i:int = 0; i <; len; i++) { 

  14.          //Debug.log(arr[i]) 


  15.            str += String.fromCharCode(arr[i]); 

  16.          } 

  17.        return str; 

  18.        } 

  19.      /** 

  20.        * 

  21.        * @param str Unicode 字符代码 

  22.        * @return 

  23.        */ 

  24.      public static function decode(str:String):Array { 

  25.        if (String.fromCharCode(str.charCodeAt(0)) != BertClass.BERT_START) { 

  26.            Debug.error(";不是有效的二进制";); 

  27.          return []; 

  28.          } 

  29.          var Obj:Object = decode_inner(str.substring(1)); 

  30.        try { 

  31.          if (Obj.rest !== ";";) { 

  32.              Debug.error(";空";); 

  33.            } 

  34.          }catch (e:Error) { 

  35.            Debug.error(";解析出错!!"; + e.toString()); 

  36.          } 

  37.      

  38.        return Obj.value; 

  39.        }; 

  40.      /** 

  41.        * 从不同类型中拿数据 

  42.        * @param str 

  43.        */ 

  44.      private static function decode_inner(str:String):Object { 

  45.          var Type:String = String.fromCharCode(str.charCodeAt(0)); 

  46.        //Debug.log(";Type:";+str.charCodeAt(0)); 


  47.        //跳过头 


  48.          var str:String = str.substring(1); 

  49.        switch (Type) { 

  50.          case BertClass.SMALL_INTEGER: 

  51.            //97 


  52.            return decode_integer(str, 1); 

  53.          break; 

  54.          case BertClass.INTEGER: 

  55.            //98 


  56.            return decode_integer(str, 4); 

  57.          break; 

  58.          case BertClass.SMALL_ATOM: 

  59.            //115 


  60.            return decode_atom(str, 1); 

  61.          break; 

  62.          case BertClass.FLOAT: 

  63.            //99 


  64.            return decode_float(str); 

  65.          break; 

  66.          case BertClass.ATOM: 

  67.            //常量 100 


  68.            return decode_atom(str, 2); 

  69.          break; 

  70.          case BertClass.STRING: 

  71.            //字符型 107 


  72.            return decode_string(str); 

  73.          case BertClass.LIST: 

  74.            //LIST 108 


  75.            return decode_list(str); 

  76.          break; 

  77.          case BertClass.SMALL_TUPLE: 

  78.            //104 {} 


  79.            return decode_tuple(str, 1); 

  80.          break; 

  81.          case BertClass.NIL: 

  82.            // 


  83.            return decode_nil(str); 

  84.          break; 

  85.          case BertClass.SMALL_BIG: 

  86.            //110 


  87.            return decode_big(str, 1); 

  88.          break; 

  89.          case BertClass.LARGE_BIG: 

  90.            //111 


  91.            return decode_big(str, 4); 

  92.          break; 

  93.          default: 

  94.              Debug.error(";找不到字节头类型"; + str.charCodeAt(0)); 

  95.              Debug.error(";找不到字节头类型"; + Type==BertClass.SMALL_INTEGER); 

  96.              Debug.error(";找不到字节头类型"; + Type); 

  97.              Debug.error(";找不到字节头类型"; + BertClass.SMALL_INTEGER); 

  98.            return { 

  99.                value:null 

  100.              }; 

  101.            } 

  102.        }; 

  103.      /** 

  104.        * 97 98 获取 

  105.        * @param str 

  106.        * @param count 

  107.        */ 

  108.      private static function decode_integer(str:String, count:int):Object { 

  109.          var Value:int = bytes_to_int(str, count); 

  110.          var temStr:String = str.substring(count); 

  111.        return { 

  112.            value: Value, 

  113.            rest: temStr 

  114.          }; 

  115.        }; 

  116.      /** 

  117.        * 99 

  118.        * @param str 

  119.        * @return 

  120.        */ 

  121.      private static function decode_float(str:String):Object { 

  122.          var Size:int = 31; 

  123.        return { 

  124.            value: parseFloat(str.substring(0, Size)), 

  125.            rest: str.substring(Size) 

  126.          }; 

  127.        }; 

  128.      /** 

  129.        * 100 常量字符获取 

  130.        * @param str 

  131.        * @param count 

  132.        * @return 

  133.        */ 

  134.      private static function decode_atom(str:String, count:int):Object { 

  135.          var Size:int; 

  136.          Size = bytes_to_int(str, count); 

  137.          var temStr:String = str.substring(count); 

  138.          var value:String; 

  139.          var temBy:ByteArray = new ByteArray(); 

  140.        for (var i:int = 0; i <; Size; i++) { 

  141.            temBy.writeByte(temStr.charCodeAt(i)); 

  142.          } 

  143.          temBy.position = 0; 

  144.          value = temBy.readUTFBytes(Size); 

  145.        return { 

  146.            value:value, 

  147.            rest:temStr.substring(Size) 

  148.          } 

  149.        }; 

  150.    

  151.      private static function decode_nil(str:String):Object { 

  152.        // nil is an empty list 


  153.        return { 

  154.            value: [], 

  155.            rest: str 

  156.          }; 

  157.        }; 

  158.      /** 

  159.        * 107 

  160.        * 获取字符串 

  161.        * @param str 

  162.        */ 

  163.      private static function decode_string(str:String):Object { 

  164.          var Size:int = bytes_to_int(str, 2); 

  165.          var temStr:String = str.substring(2); 

  166.          var temBy:ByteArray = new ByteArray(); 

  167.          var value:String; 

  168.        for (var i:int = 0; i <; Size; i++) { 

  169.            temBy.writeByte(temStr.charCodeAt(i)); 

  170.          } 

  171.          temBy.position = 0; 

  172.          value = temBy.readUTFBytes(Size); 

  173.        return { 

  174.            value: value, 

  175.            rest: temStr.substring(Size) 

  176.          }; 

  177.        }; 

  178.      /** 

  179.        * 104 

  180.        * @param str 

  181.        * @param count 

  182.        * @return 

  183.        */ 

  184.      private static function decode_tuple(str:String, count:int):Object { 

  185.          var Arr:Array = new Array(); 

  186.          var El:Object; 

  187.          var Size:int = bytes_to_int(str, count); 

  188.          var temStr:String = str.substring(count); 

  189.        for (var i:int = 0; i <; Size; i++) { 

  190.            El = decode_inner(temStr); 

  191.            Arr.push(El.value); 

  192.            temStr = El.rest; 

  193.          } 

  194.        return { 

  195.            value: Arr, 

  196.            rest: temStr 

  197.          }; 

  198.        }; 

  199.      /** 

  200.        * 108 

  201.        */ 

  202.      private static function decode_list(str:String):Object { 

  203.          var Size:int; 

  204.          var El:Object; 

  205.          var LastChar:String; 

  206.          var Arr:Array = new Array(); 

  207.          Size = bytes_to_int(str, 4); 

  208.          var temStr:String = str.substring(4); 

  209.        for (var i:int = 0; i <; Size; i++) { 

  210.            El = decode_inner(temStr); 

  211.            Arr.push(El.value); 

  212.            temStr = El.rest; 

  213.          } 

  214.          LastChar = String.fromCharCode(temStr.charCodeAt(0)); 

  215.        if (LastChar != BertClass.NIL) { 

  216.            Debug.error(";数组未结束";); 

  217.          } 

  218.          var temStr2:String = temStr.substring(1); 

  219.        return { 

  220.            value: Arr, 

  221.            rest: temStr2 

  222.          }; 

  223.        }; 

  224.      /** 

  225.        * 110 111 

  226.        */ 

  227.      private static function decode_big(str:String, count:int):Object { 

  228.          var Size:int, Value:Number; 

  229.          Size = bytes_to_int(str, count); 

  230.          var temStr:String = str.substring(count); 

  231.          Value = bytes_to_bignum(temStr, Size); 

  232.        return { 

  233.            value : Value, 

  234.            rest: temStr.substring(Size + 1) 

  235.          }; 

  236.        }; 

  237.      /** 

  238.        * 大数字算法 

  239.        * @param str 

  240.        * @param count 

  241.        */ 

  242.      private static function bytes_to_bignum(str:String, count:int):Number { 

  243.          var isNegative:Boolean; 

  244.          var n:Number; 

  245.          var Num:Number; 

  246.          isNegative = (str.charCodeAt(0) === 1); 

  247.          str = str.substring(1); 

  248.        for (var i:int = count - 1; i >;= 0; i--) { 

  249.            n = str.charCodeAt(i); 

  250.          if (Num === 0) { 

  251.              Num = n; 

  252.            } 

  253.          else { 

  254.              Num = Num * 256 + n; 

  255.            } 

  256.          } 

  257.        if (isNegative) { 

  258.          return Num * -1; 

  259.          } 

  260.        return Num; 

  261.        }; 

  262.      /** 

  263.        * 返回获取数据的长度 

  264.        * @param str 

  265.        * @param Length 

  266.        * @return 

  267.        */ 

  268.      private static function bytes_to_int(str:String, Length:int):int { 

  269.          var isNegative:Boolean; 

  270.          var n:Number ; 

  271.          var Num:int; 

  272.          isNegative = (str.charCodeAt(0) >; 128); 

  273.        for (var i:int = 0; i <; Length; i++) { 

  274.            n = str.charCodeAt(i); 

  275.          if (isNegative) { 

  276.              n = 255 - n; 

  277.            } 

  278.          if (Num === 0) { 

  279.              Num = n; 

  280.            }else { 

  281.              Num = Num * 256 + n; 

  282.            } 

  283.          } 

  284.        if (isNegative) { 

  285.            Num = Num * (0 - 1); 

  286.          } 

  287.        return Num; 

  288.        }; 

  289.      ///----发送--- 


  290.      /** 

  291.        * 发送数据解析 

  292.        * @param _arr:Array 发送数据数组 

  293.        * @return 返回ByteArray 对象 

  294.        */ 

  295.      public static function parseSendData(_arr:Array):ByteArray { 

  296.          var TemByteArr:ByteArray = new ByteArray(); 

  297.          var ReturnTemArr:ByteArray = new ByteArray(); 

  298.          var temBy:Array = new Array(); 

  299.        //TemByteArr.writeShort(_arr.length); 


  300.          TemByteArr.writeByte(131); 

  301.          TemByteArr.writeByte(104); 

  302.          TemByteArr.writeByte(_arr.length); 

  303.          temBy = sendData(_arr); 

  304.        for (var i :int = 0; i <; temBy.length; i++) { 

  305.          //Debug.log(temBy[i]) 


  306.            TemByteArr.writeByte(temBy[i]); 

  307.          } 

  308.          ReturnTemArr.writeUnsignedInt(TemByteArr.length); 

  309.        //加密发送 


  310.          ReturnTemArr.writeBytes(Encrypt.enArc4(TemByteArr)); 

  311.        return ReturnTemArr as ByteArray; 

  312.        } 

  313.      /** 

  314.        * 声明 暂时没找到AS3区分字符串与常量的办法 故已特殊字符做了一下处理 

  315.        * @param _arr:Array 查询数组 

  316.        * @return 二进制数组 

  317.        */ 

  318.      private static function sendData(_arr:Array):Array { 

  319.          var len:int = _arr.length; 

  320.          var SendByteArray:Array = new Array(); 

  321.        for (var s:int = 0; s <; len; s++) { 

  322.          if (_arr[s] is String) { 

  323.            if (_arr[s].substr(0, 6) == ";const@";) { 

  324.                SendByteArray=SendByteArray.concat(DataUtil.parseCode(_arr[s].split(/@/)[1], ";const";)); 

  325.              }else { 

  326.                SendByteArray=SendByteArray.concat(DataUtil.parseCode(_arr[s], ";string";)); 

  327.              } 

  328.            }else if (_arr[s] is Number) { 

  329.              SendByteArray = SendByteArray.concat(DataUtil.parseCode(_arr[s], ";number";)); 

  330.            }else if (_arr[s] is Array) { 

  331.              SendByteArray = SendByteArray.concat([104,_arr[s].length]); 

  332.              sendData(_arr[s]); 

  333.            continue; 

  334.            } 

  335.          } 

  336.      

  337.        return SendByteArray as Array; 

  338.        } 



  339. }


 

 


文章来自:http://www.docin.com/p-283841811.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值