Flash AS3 Base64

网上找到的Base64执行速度都不怎么快,原因是代码对Flash执行机制没有针对性优化。 下面给出优化过的Base64

必须使用Flex sdk 4.5增强补丁才能完整编译

package {    
   
    import flash.utils.ByteArray;    
    /*
  * 优化Base64
  * 主要优化执行方式,尽量减少调用函数和尽可能不使用循环
  * 优化后提升执行速度是原来的10倍
  * Directed by kiwiw3
  * */
    public class MyBase64 {    
            
        public static const version:String = "2.0.0";    
   
        public static function encode(data:String):String {    
            var bytes:ByteArray = new ByteArray();    
            bytes.writeUTFBytes(data);    
                
            return encodeByteArray(bytes);    
        }    
            
        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];
  
        public static function encodeByteArray(data:ByteArray):String {    
            var output:ByteArray = new ByteArray();    
                
   var opbuf0:int;
   var opbuf1:int;
   var opbuf2:int;
   var opbuf3:int;
   
   var dblen:int = 0;
   var resultlen:uint = data.length;
   var position:uint = 0;
   var oplen:uint = 0;
            while (resultlen > 0) {
                if (resultlen >= 3) {
     dblen = 3;
     resultlen -= 3;
    }else {
     dblen = resultlen;
     resultlen = 0;
    }
    
    
                opbuf0 = (data[position] & 0xfc) >> 2;
    
    if(dblen>=1)
                opbuf1 = ((data[position] & 0x03) << 4) | ((data[position + 1]) >> 4);
    else
    opbuf1 = 64;
    
    if(dblen>=2)
                opbuf2 = ((data[position + 1] & 0x0f) << 2) | ((data[position + 2]) >> 6);
    else
    opbuf2 = 64;
    
    if(dblen>=3)
                opbuf3 = data[position + 2] & 0x3f;
    else
    opbuf3 = 64;
                    
    
    output[oplen]= BASE64_CHARARR[opbuf0];    
    output[oplen+1]= BASE64_CHARARR[opbuf1];    
    output[oplen+2]= BASE64_CHARARR[opbuf2];
    output[oplen+3]= BASE64_CHARARR[opbuf3];
                
    position += 3;
    oplen += 4;
    
            }    
   return output.readUTFBytes(oplen);
        }
            
        public static function decode(data:String):String {    
            var bytes:ByteArray = decodeToByteArray(data);    
                
            return bytes.readUTFBytes(bytes.length);    
        }
            
        public static function decodeToByteArray(_data:String):ByteArray {    
            var output:ByteArray = new ByteArray();
   
   var data:ByteArray = new ByteArray();
   data.writeUTFBytes(_data);
   
   var databuf0:int;
   var databuf1:int;
   var databuf2:int;
   var databuf3:int;
   
   var resultlen:uint = data.length;
   var position:uint = 0;
   var oplen:uint = 0;
   
            while (resultlen>0) {    
    
    databuf0=find(data[position]);
    
    if (resultlen >= 1)
    {
     databuf1=find(data[int(position+ 1)]);
    }
    
    if (resultlen >= 2)
    {
     databuf2=find(data[int(position+ 2)]);
    }
    
    if (resultlen >= 3) {
     databuf3=find(data[int(position+3)]);
    }
                    
     
    if (databuf1 != 64) {
     output[oplen] = (databuf0 << 2) + ((databuf1 & 0x30) >> 4);
     if (databuf2 != 64) {
      output[oplen + 1] = ((databuf1 & 0x0f) << 4) + ((databuf2 & 0x3c) >> 2);  
      if (databuf3 != 64) {
       output[oplen+ 2] = ((databuf2 & 0x03) << 6) + databuf3;
      }
     }
    }
    
    position += 4;
    oplen += 3;
    resultlen -= 4;
            }
            return output;    
        }    
            
        public function MyBase64() {    
            throw new Error("Base64 class is static container only");    
        }
  
  private inline function find(val:int):int {
   if (val >= 65 && val<=90) {
    return val-65;
   }else if (val >= 97 && val<=122) {
    return 26+val-97;
   }else if (val >= 48 && val<=57) {
    return 52+val-48;
   }else if (val==43) {
    return 62;
   }else if (val==47) {
    return 63;
   }else if (val==61) {
    return 64;
   }
  }
    }    
} 

转载于:https://my.oschina.net/3kis/blog/78953

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值