Base64 Class

by WLAD
♥0 | Line 72 | Modified 2013-04-27 21:02:09 | MIT License
play

ActionScript3 source code

/**
 * Copyright WLAD ( http://wonderfl.net/user/WLAD )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/lOHK
 */

package {import flash.display.Sprite;public class FakeStage extends Sprite {public function FakeStage() {addChild(new Main());}}}
import flash.events.*;
import flash.display.*;
import com.bit101.components.*;


class Main extends Sprite
{
    //Top text area
    private var txt1:TextArea;
    //Button text area
    private var txt2:TextArea;
    
    public function Main()
    {
        addEventListener(Event.ADDED_TO_STAGE,init);
    }
    private function init(e:Event):void
    {        
        iniComponents();
    }
    
    private function doEncode(e:Event):void
    {
        try {
            
            //TODO: fix this shit???
            /*
            var ba:ByteArray = new ByteArray();
            //ba.writeUTFBytes(txt2.text);
            ba.writeUTF(txt2.text);
            txt1.text = Base64.encode(ba);
            */
            txt1.text = Base64.encode(convertStringToByteArray(txt2.text)).toString();
        } catch(e:Error) {
            txt1.text = e.toString() + "\n\nToo short?";
        }
    }
    
    private function doDecode(e:Event):void
    {
        try {
            /*
            var ba:ByteArray = new ByteArray();
            ba.writeUTF(txt1.text);
            txt2.text = ba.toString();
            */
            txt2.text = Base64.decode(txt1.text).toString();
            //txt2.text = String(Base64.decode(txt1.text).readObject());
        } catch(e:Error) {
            txt2.text = e.toString() + "\n\nToo short?";
        }
    }
    
    //http://stackoverflow.com/questions/3477978/as3-can-bytearray-return-its-content-as-a-string-with-two-bytes-per-unicode-cha
    public function convertStringToByteArray(str:String):ByteArray {
        var result:ByteArray = new ByteArray();
        for (var i:int = 0; i < str.length; ++i) {
            result.writeShort(str.charCodeAt(i));
        }
        result.position = 0;
        return result;
    }
    
    

    private function iniComponents():void
    {
        var w:int = int(stage.stageWidth);
        var h:int = int(stage.stageHeight);
        var space:int = 40;
        var space2:int = 5;
        var btn:PushButton;
        txt1 = new TextArea(this,space2 ,space2,"");
        txt1.width = w - space2 * 2;
        txt1.height = h / 2 - space - space2 * 2;
        txt2 = new TextArea(this,space2,h / 2 + space,"");
        
        txt2.width = txt1.width /= 2;
        txt2.height = txt1.height /= 2;
        txt2.scaleX = txt1.scaleX = txt2.scaleY = txt1.scaleY = 2;
        
        btn = new PushButton(this,space2, h / 2 - space / 2 , "\\/  Decode to Base64  \\/",doDecode);
        btn.height = space;
        btn.width = w / 2 - space2 * 3;
        btn = new PushButton(this,w / 2 + space2, h / 2 - space / 2 , "/\\  Encode from Base64  /\\",doEncode);
        btn.height = space;
        btn.width = w / 2 - space2 * 3;
    }
}

/* Base64 library for ActionScript 3.0.    * Based on: Ma Bingyao code.    * Optimized by: Jean-Philippe Auclair  / jpauclair.wordpress.com    * Copyright (C) 2007 Ma Bingyao <andot@ujn.edu.cn>    * LastModified: Oct 26, 2009    * This library is free.  You can redistribute it and/or modify it.    */
import flash.utils.ByteArray;
class Base64
{
    private static const _encodeChars:Vector.<int> = InitEncoreChar();
    private static const _decodeChars:Vector.<int> = InitDecodeChar();
    
    public static function encode(data:ByteArray):String                {var out:ByteArray = new ByteArray();out.length = (2 + data.length - ((data.length + 2) % 3)) * 4 / 3;var i:int = 0;var r:int = data.length % 3;var len:int = data.length - r;var c:int;while (i < len){c = data[i++] << 16 | data[i++] << 8 | data[i++];c = (_encodeChars[c >>> 18] << 24) | (_encodeChars[c >>> 12 & 0x3f] << 16) | (_encodeChars[c >>> 6 & 0x3f] << 8 ) | _encodeChars[c & 0x3f];out.writeInt(c);}if (r == 1){c = data[i];c = (_encodeChars[c >>> 2] << 24) | (_encodeChars[(c & 0x03) << 4] << 16) | 61 << 8 | 61;out.writeInt(c);}else if (r == 2){c = data[i++] << 8 | data[i];c = (_encodeChars[c >>> 10] << 24) | (_encodeChars[c >>> 4 & 0x3f] << 16) | (_encodeChars[(c & 0x0f) << 2] << 8 ) | 61;out.writeInt(c);}out.position = 0;return out.readUTFBytes(out.length);}
    public static function decode(str:String):ByteArray                 {var c1:int;var c2:int;var c3:int;var c4:int;var i:int;var len:int;var out:ByteArray;len = str.length;i = 0;out = new ByteArray();var byteString:ByteArray = new ByteArray();byteString.writeUTFBytes(str);while (i < len){do{c1 = _decodeChars[byteString[i++]];} while (i < len && c1 == -1);if (c1 == -1) break;do{c2 = _decodeChars[byteString[i++]];} while (i < len && c2 == -1);if (c2 == -1) break;out.writeByte((c1 << 2) | ((c2 & 0x30) >> 4));do{c3 = byteString[i++];if (c3 == 61) return out;c3 = _decodeChars[c3];} while (i < len && c3 == -1);if (c3 == -1) break;out.writeByte(((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2));do {c4 = byteString[i++];if (c4 == 61) return out;c4 = _decodeChars[c4];} while (i < len && c4 == -1);if (c4 == -1) break;out.writeByte(((c3 & 0x03) << 6) | c4);}return out;}
    public static function InitEncoreChar() : Vector.<int>              {var encodeChars:Vector.<int> = new Vector.<int>();var chars:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for (var i:int = 0; i < 64; i++){encodeChars.push(chars.charCodeAt(i));}return encodeChars;}
    public static function InitDecodeChar() : Vector.<int>              {var decodeChars:Vector.<int> = new Vector.<int>();decodeChars.push(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,-1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1);return decodeChars;}
}