Base64编码解码

  最近在做一个读邮件的东西,涉及到base64编码,所以查了一下相关资料。

  base64就是把原文转成A-Z a-z 0-9 +/这64个字符,所以叫base64编码。

  base64的规则很简单,就是把3个8bit的字节转成 4个 6bit的字节 3*8 == 4*6。所以原文字节总数必须是3的倍数,不足的以“=”补。如果原文字节数 / 3 余 1, 就补2个=,/3余2就补一个=。这里补=是在转换后的base64 string后加=,不是转之前。

  代码

        private static const BASE64_CHARS:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";   
        
        public static function encode(data:String, charset:String="gb2312"):String 
        {   
            // Convert string to ByteArray   
            var bytes:ByteArray = new ByteArray();   
            bytes.writeMultiByte(data, charset);
            
            // 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;   //0xfc = 11111100
                outputBuffer[1] = ((dataBuffer[0] & 0x03) << 4) | ((dataBuffer[1]) >> 4);//0x03 = 00000011
                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;   
        } 
  

  dataBuffer[0] & 0xfc) >> 2的意思是把第一个字节和11111100 做&操作再右移两位,也就是取第一个字节的前6位。后2,3,4个字节的取法也和前面一样。

  解码的代码一样就不上了。

  需注意的是encode(data:String, charset:String="gb2312"),编码和解码的时候都要指定charset,就是原文是什么charset,编码解码的时候就要用什么charset,否则会乱码。

  预览:

   

  代码下载点这里
posted @ 2013-03-11 14:18  Michael Lin  阅读(425)  评论(0编辑  收藏  举报