智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...

导航

基于flash AS3.0 的BASE64编码与解码类

Posted on 2009-12-01 17:59  Bill Yuan  阅读(7600)  评论(0编辑  收藏  举报
代码
//调用代码:

import com.dynamicflash.utils.Base64;      
  
//编码和解码字符串     
var source:String = "Hello, world";      
var encoded:String 
= Base64.encode(source);      
trace(encoded);      
     
var decoded:String 
= Base64.decode(encoded);      
trace(decoded);     
  
//编码和解码ByteArray     
var obj:Object= {name:"Dynamic Flash",url:"http://dynamicflash.com"};   
var source:ByteArray 
= new ByteArray();   
source.writeObject(obj);   
  
var encoded:String 
= Base64.encodeByteArray(source);   
trace(encoded);   
  
var decoded:ByteArray 
= Base64.decodeToByteArray(encoded);   
obj 
= decoded.readObject();   
trace(obj.name 
+ "(" + obj.url + ")");  


//Base64类代码:


package com.dynamicflash.util{   
  
    
import flash.utils.ByteArray;   
       
    
public class Base64 {   
           
        
private static const BASE64_CHARS:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";   
  
        
public static const version:String = "1.0.0";   
  
        
public static function encode(data:String):String {   
            
// Convert string to ByteArray   
            var bytes:ByteArray = new ByteArray();   
            bytes.writeUTFBytes(data);   
               
            
// Return encoded ByteArray   
            return encodeByteArray(bytes);   
        }   
           
        
public static function encodeByteArray(data:ByteArray):String {   
            
// Initialise output   
            var output:String = "";   
               
            
// Create data and output buffers   
            var dataBuffer:Array;   
            var outputBuffer:Array 
= new Array(4);   
               
            
// Rewind ByteArray   
            data.position = 0;   
               
            
// while there are still bytes to be processed   
            while (data.bytesAvailable > 0) {   
                
// Create new data buffer and populate next 3 bytes from data   
                dataBuffer = new Array();   
                
for (var i:uint = 0; i < 3 && data.bytesAvailable > 0; i++) {   
                    dataBuffer[i] 
= data.readUnsignedByte();   
                }   
                   
                
// Convert to data buffer Base64 character positions and    
                
// store in output buffer   
                outputBuffer[0= (dataBuffer[0& 0xfc>> 2;   
                outputBuffer[
1= ((dataBuffer[0& 0x03<< 4| ((dataBuffer[1]) >> 4);   
                outputBuffer[
2= ((dataBuffer[1& 0x0f<< 2| ((dataBuffer[2]) >> 6);   
                outputBuffer[
3= dataBuffer[2& 0x3f;   
                   
                
// If data buffer was short (i.e not 3 characters) then set   
                
// end character indexes in data buffer to index of '=' symbol.   
                
// This is necessary because Base64 data is always a multiple of   
                
// 4 bytes and is basses with '=' symbols.   
                for (var j:uint = dataBuffer.length; j < 3; j++) {   
                    outputBuffer[j 
+ 1= 64;   
                }   
                   
                
// Loop through output buffer and add Base64 characters to    
                
// encoded data string for each character.   
                for (var k:uint = 0; k < outputBuffer.length; k++) {   
                    output 
+= BASE64_CHARS.charAt(outputBuffer[k]);   
                }   
            }   
               
            
// Return encoded data   
            return output;   
        }   
           
        
public static function decode(data:String):String {   
            
// Decode data to ByteArray   
            var bytes:ByteArray = decodeToByteArray(data);   
               
            
// Convert to string and return   
            return bytes.readUTFBytes(bytes.length);   
        }   
           
        
public static function decodeToByteArray(data:String):ByteArray {   
            
// Initialise output ByteArray for decoded data   
            var output:ByteArray = new ByteArray();   
               
            
// Create data and output buffers   
            var dataBuffer:Array = new Array(4);   
            var outputBuffer:Array 
= new Array(3);   
  
            
// While there are data bytes left to be processed   
            for (var i:uint = 0; i < data.length; i += 4) {   
                
// Populate data buffer with position of Base64 characters for   
                
// next 4 bytes from encoded data   
                for (var j:uint = 0; j < 4 && i + j < data.length; j++) {   
                    dataBuffer[j] 
= BASE64_CHARS.indexOf(data.charAt(i + j));   
                }   
                   
                
// Decode data buffer back into bytes   
                outputBuffer[0= (dataBuffer[0<< 2+ ((dataBuffer[1& 0x30>> 4);   
                outputBuffer[
1= ((dataBuffer[1& 0x0f<< 4+ ((dataBuffer[2& 0x3c>> 2);           
                outputBuffer[
2= ((dataBuffer[2& 0x03<< 6+ dataBuffer[3];   
                   
                
// Add all non-padded bytes in output buffer to decoded data   
                for (var k:uint = 0; k < outputBuffer.length; k++) {   
                    
if (dataBuffer[k+1== 64break;   
                    output.writeByte(outputBuffer[k]);   
                }   
            }   
               
            
// Rewind decoded data ByteArray   
            output.position = 0;   
               
            
// Return decoded data   
            return output;   
        }   
           
        
public function Base64() {   
            
throw new Error("Base64 class is static container only");   
        }   
    }   
}