·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]as3版优化后的base64加密解密类(是原来的10倍)

时间:2012-12-20 14:02cuplayer
网上找到的Base64执行速度都不怎么快,原因是代码对Flash执行机制没有针对性优化。 下面给出优化过的Base64,必须使用Flex sdk 4.5增强补丁才能完整编译

[AS3]as3版优化后的base64加密解密类(是原来的10倍)

  1. package {      
  2.      
  3.     import flash.utils.ByteArray;      
  4.     /*  
  5.   * 优化Base64  
  6.   * 主要优化执行方式,尽量减少调用函数和尽可能不使用循环  
  7.   * 优化后提升执行速度是原来的10倍  
  8.   * Directed by kiwiw3  
  9.   * */  
  10.     public class MyBase64 {      
  11.               
  12.         public static const version:String = "2.0.0";      
  13.      
  14.         public static function encode(data:String):String {      
  15.             var bytes:ByteArray = new ByteArray();      
  16.             bytes.writeUTFBytes(data);      
  17.                   
  18.             return encodeByteArray(bytes);      
  19.         }      
  20.               
  21.         private static const BASE64_CHARARR:Vector.<int> = new <int>[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,48,49,50,51,52,53,54,55,56,57,43,47,61];  
  22.     
  23.         public static function encodeByteArray(data:ByteArray):String {      
  24.             var output:ByteArray = new ByteArray();      
  25.                   
  26.    var opbuf0:int;  
  27.    var opbuf1:int;  
  28.    var opbuf2:int;  
  29.    var opbuf3:int;  
  30.      
  31.    var dblen:int = 0;  
  32.    var resultlen:uint = data.length;  
  33.    var position:uint = 0;  
  34.    var oplen:uint = 0;  
  35.             while (resultlen > 0) {  
  36.                 if (resultlen >= 3) {  
  37.      dblen = 3;  
  38.      resultlen -3;  
  39.     }else {  
  40.      dblen = resultlen;  
  41.      resultlen = 0;  
  42.     }  
  43.       
  44.       
  45.                 opbuf0 = (data[position] & 0xfc) >> 2;  
  46.       
  47.     if(dblen>=1)  
  48.                 opbuf1 = ((data[position] & 0x03) << 4) | ((data[position + 1]) >> 4);  
  49.     else  
  50.     opbuf1 = 64;  
  51.       
  52.     if(dblen>=2)  
  53.                 opbuf2 = ((data[position + 1] & 0x0f) << 2) | ((data[position + 2]) >> 6);  
  54.     else  
  55.     opbuf2 = 64;  
  56.       
  57.     if(dblen>=3)  
  58.                 opbuf3 = data[position + 2] & 0x3f;  
  59.     else  
  60.     opbuf3 = 64;  
  61.                       
  62.       
  63.     output[oplen]= BASE64_CHARARR[opbuf0];      
  64.     output[oplen+1]= BASE64_CHARARR[opbuf1];      
  65.     output[oplen+2]= BASE64_CHARARR[opbuf2];  
  66.     output[oplen+3]= BASE64_CHARARR[opbuf3];  
  67.                   
  68.     position += 3;  
  69.     oplen += 4;  
  70.       
  71.             }      
  72.    return output.readUTFBytes(oplen);  
  73.         }  
  74.               
  75.         public static function decode(data:String):String {      
  76.             var bytes:ByteArray = decodeToByteArray(data);      
  77.                   
  78.             return bytes.readUTFBytes(bytes.length);      
  79.         }  
  80.               
  81.         public static function decodeToByteArray(_data:String):ByteArray {      
  82.             var output:ByteArray = new ByteArray();  
  83.      
  84.    var data:ByteArray = new ByteArray();  
  85.    data.writeUTFBytes(_data);  
  86.      
  87.    var databuf0:int;  
  88.    var databuf1:int;  
  89.    var databuf2:int;  
  90.    var databuf3:int;  
  91.      
  92.    var resultlen:uint = data.length;  
  93.    var position:uint = 0;  
  94.    var oplen:uint = 0;  
  95.      
  96.             while (resultlen>0) {      
  97.       
  98.     databuf0=find(data[position]);  
  99.       
  100.     if (resultlen >= 1)  
  101.     {  
  102.      databuf1=find(data[int(position+ 1)]);  
  103.     }  
  104.       
  105.     if (resultlen >= 2)  
  106.     {  
  107.      databuf2=find(data[int(position+ 2)]);  
  108.     }  
  109.       
  110.     if (resultlen >= 3) {  
  111.      databuf3=find(data[int(position+3)]);  
  112.     }  
  113.                       
  114.        
  115.     if (databuf1 != 64) {  
  116.      output[oplen] = (databuf0 << 2) + ((databuf1 & 0x30) >> 4);  
  117.      if (databuf2 != 64) {  
  118.       output[oplen + 1] = ((databuf1 & 0x0f) << 4) + ((databuf2 & 0x3c) >> 2);    
  119.       if (databuf3 != 64) {  
  120.        output[oplen+ 2] = ((databuf2 & 0x03) << 6) + databuf3;  
  121.       }  
  122.      }  
  123.     }  
  124.       
  125.     position += 4;  
  126.     oplen += 3;  
  127.     resultlen -4;  
  128.             }  
  129.             return output;      
  130.         }      
  131.               
  132.         public function MyBase64() {      
  133.             throw new Error("Base64 class is static container only");      
  134.         }  
  135.     
  136.   private inline function find(val:int):int {  
  137.    if (val >= 65 && val<=90) {  
  138.     return val-65;  
  139.    }else if (val >= 97 && val<=122) {  
  140.     return 26+val-97;  
  141.    }else if (val >= 48 && val<=57) {  
  142.     return 52+val-48;  
  143.    }else if (val==43) {  
  144.     return 62;  
  145.    }else if (val==47) {  
  146.     return 63;  
  147.    }else if (val==61) {  
  148.     return 64;  
  149.    }  
  150.   }  
  151.     }      
  152. }    

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器