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,否则会乱码。
预览:
代码下载点这里