AS3版Base64的解码和编码类
发布:kinglong | 发布时间: 2007年3月15日在一个德文网站找到的,它原来是Flex版,我在原来的基础上改成AS3版
| package com.klstudio.util{ import flash.utils.*; import flash.errors.EOFError; class StringBuilder public function append(value:String):void{ public function get length():uint{ public function toString():String{ } class StringUtil{ function StringUtil() { } public static function isWhitespace(char:String):Boolean{ return trim(char).length == 0; } public static function trim(char:String):String{ return rtrim(ltrim(char)); } public static function ltrim(char:String):String{ var pattern:RegExp = /^\s*/; return char.replace(pattern,""); } public static function rtrim(char:String):String{ var pattern:RegExp = /\s*$/; return char.replace(pattern,""); } } // 上面StringUtil类和StringBuilder类,是因为flex改成as3后所没有类,我这边自己重写一下(还没过多考虑到效率)! // 下面Base64类,是在找到的flex版上改过来的! public class Base64 { // the Base64 "alphabet" private static var _b64Chars:Array=new Array( 'A','B','C','D','E','F','G','H', 'I','J','K','L','M','N','O','P', 'Q','R','S','T','U','V','W','X', 'Y','Z','a','b','c','d','e','f', 'g','h','i','j','k','l','m','n', 'o','p','q','r','s','t','u','v', 'w','x','y','z','0','1','2','3', '4','5','6','7','8','9','+','/' ) // the reverse-lookup object used for decoding private static var _b64Lookup:Object=_buildB64Lookup(); // the boolean to insert linebreaks after 76 chars into the Base64 encoded string private static var _linebreaks:Boolean; /* * The class method for encoding an array of bytes to a Base64 encoded string. * * @param bArr A ByteArray containing values to encode * @param linebreaks A boolean to insert a linebreak after 76 Base64-chars * @return The Base64 encoded string * */ public static function encode(bArr:ByteArray, linebreaks:Boolean=false):String { _linebreaks= linebreaks; return _encodeBytes(bArr); } /* * The class method for decoding a Base64 encoded string to an array of bytes. * * @param str A Base64 encoded string * @return An array of bytes * */ public static function decode(str:String):ByteArray { return _decodeSring(str); } /* * The private helper class method to build an object used for reverse B64 char lookup. * * @return An object with each B64 char as a property containing the corresponding value * */ private static function _buildB64Lookup():Object { var obj:Object=new Object(); for (var i:Number=0; i < _b64Chars.length; i++) { obj[_b64Chars[i]]=i; } return obj; } /* * The private helper class method to determine whether a given char is B64 compliant. * * @param char A character as string (length=1) * @return A boolean indicating the given char *is* in the B64 alphabet * */ private static function _isBase64(char:String):Boolean { return _b64Lookup[char] != undefined; } /* * The private class method for encoding an array of bytes into a B64 encoded string. * * @param bs An array of bytes * @return The B64 encoded string * * @see Base64.encode() * */ private static function _encodeBytes(bs:ByteArray):String { var b64EncStr:StringBuilder=new StringBuilder(); var bufferSize:uint; var col:uint=0; bs.position=0; while (bs.position < bs.length) { bufferSize= bs.bytesAvailable >= 3 ? 3 : bs.bytesAvailable; var byteBuffer:ByteArray=new ByteArray(); bs.readBytes(byteBuffer, 0, bufferSize); b64EncStr.append( _b64EncodeBuffer(byteBuffer) ); col+=4; if (_linebreaks && col%76 == 0) { b64EncStr.append("\n"); col=0; } } return b64EncStr.toString(); } /* * The private class method for encoding a buffer of 3 bytes (24bit) to 4 B64-chars * (representing 6bit each => 24bit). * * @param buffer An array of bytes (1 <= length <= 3) * @return The byte buffer encoded to 4 B64 chars as string * * @see Base64._encodeBytes() * */ private static function _b64EncodeBuffer(buffer:ByteArray):String { var bufferEncStr:StringBuilder=new StringBuilder(); bufferEncStr.append( _b64Chars[buffer[0] >> 2] ); switch (buffer.length) { case 1 : bufferEncStr.append( _b64Chars[((buffer[0] << 4) & 0x30)] ); bufferEncStr.append("=="); break; case 2 : bufferEncStr.append( _b64Chars[(buffer[0] << 4) & 0x30 | buffer[1] >> 4] ); bufferEncStr.append( _b64Chars[(buffer[1] << 2) & 0x3c] ); bufferEncStr.append("="); break; case 3 : bufferEncStr.append( _b64Chars[(buffer[0] << 4) & 0x30 | buffer[1] >> 4] ); bufferEncStr.append( _b64Chars[(buffer[1] << 2) & 0x3c | buffer[2] >> 6] ); bufferEncStr.append( _b64Chars[buffer[2] & 0x3F] ); break; default : trace("Base64 byteBuffer outOfRange"); } return bufferEncStr.toString(); } /* * The private class method for decoding a string containing B64 chars to an array of bytes * * @param s The B64 encoded string * @return A decoded array of bytes * * @see Base64.decode() * */ private static function _decodeSring(s:String):ByteArray { var b64EncString:StringBuilder=new StringBuilder(s); var b64DecBytes:ByteArray=new ByteArray(); var stringBuffer:StringBuilder=new StringBuilder(); var lgth:uint=b64EncString.length; for (var i:uint=0; i < lgth; i++) { var char:String=b64EncString.charAt(i); if (!StringUtil.isWhitespace(char) && (_isBase64(char) || char == "=")) { stringBuffer.append(char); if (stringBuffer.length == 4) { b64DecBytes.writeBytes( _b64DecodeBuffer(stringBuffer) ); stringBuffer=new StringBuilder(); } } } b64DecBytes.position=0; return b64DecBytes; } /* * The private class method for decoding a string buffer of 4 B64 chars * (each representing 6bit) to an array of 3 bytes. * * @param buffer A string containing B64 chars (length = 4) * @return An array of bytes containing the decoded values * * @see Base64._decodeBytes() * */ private static function _b64DecodeBuffer(buffer:StringBuilder):ByteArray { var bufferEncBytes:ByteArray=new ByteArray(); var charValue1:uint=_b64Lookup[buffer.charAt(0)]; var charValue2:uint=_b64Lookup[buffer.charAt(1)]; var charValue3:uint=_b64Lookup[buffer.charAt(2)]; var charValue4:uint=_b64Lookup[buffer.charAt(3)]; bufferEncBytes.writeByte(charValue1 << 2 | charValue2 >> 4); if (buffer.charAt(2) != "=") bufferEncBytes.writeByte(charValue2 << 4 | charValue3 >> 2); if (buffer.charAt(3) != "=") bufferEncBytes.writeByte(charValue3 << 6 | charValue4); return bufferEncBytes; } } } |
- 相关文章:
[转载]AS2转AS3 (2007-3-13 12:54:4)
Flash全屏功能测试 (2007-1-10 14:55:25)
在as和js里都可以使用的小方法整理01 (2006-11-17 10:20:48)
发布博客版MediaPlayer播放器 (2006-11-8 0:3:43)
最近开发的一个Flash视频以及聊天功能的整合项目 (2006-10-14 10:15:55)
[原创]FMPlayer组件说明 (2006-10-10 16:11:54)
[原创]可定制界面,可缓冲显示的窗体类 (2006-9-28 14:23:0)
AXObject可用来解决IE需要激活 ActiveX 控件和生成控件调用代码; (2006-9-21 10:16:59)
Ajax应用研究-注册应用 (2006-8-7 9:35:50)
java实现中英文混合字符截取方法 (2006-7-21 0:17:28)
- 1.wersling
- http://www.wersling.com
- 你这个好象中文不支持,看看这个吧:http://www.dynamicflash.com/goodies/base64
- 2007-3-19 10:18:21 回复该留言
- 2.kinglong
- http://www.klstudio.com
- 我刚才试了一下你刚才提供的地址,发现他那个Base64类的方法更好一些,谢了!
- 2007-3-20 9:16:24 回复该留言
发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。




