In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

16進文字列→36進連長圧縮

16進数文字列←→36進数連長圧縮
rle(hex)→36rle
rld(36rle)→hex
16進数でゲームのリプレイデータを記録したりする場合に使えるかもしれない
ちょっといじれば16進数じゃなくてもできますし。
Get Adobe Flash player
by Susisu 28 Jan 2010
    Embed
/*
16進数文字列←→36進数連長圧縮
rle(hex)→36rle
rld(36rle)→hex
16進数でゲームのリプレイデータを記録したりする場合に使えるかもしれない
ちょっといじれば16進数じゃなくてもできますし。
*/
package {
    import flash.display.*;  
    import flash.text.*;
    import flash.events.MouseEvent;
    public class hex_rle_rld extends Sprite {
    	    public function hex_rle_rld() {
            var tf:TextField=new TextField();
            tf.type=TextFieldType.INPUT;
            tf.border=true;
            tf.text="01234555556789aabbaabbcdeffffff";
            tf.x=30;
            tf.y=80;
            tf.width=400
            tf.height=300;
            tf.wordWrap=true;
            addChild(tf);
            
            var eButton:Sprite=new Sprite();
            var etf:TextField=new TextField();
            etf.text="Encode";
            etf.selectable=false;
            etf.backgroundColor=0x000000;
            etf.textColor=0xFFFFFF;
            etf.background=true;
            etf.border=true;
            etf.x=30;
            etf.y=50;
            etf.autoSize=TextFieldAutoSize.LEFT;
            eButton.addChild(etf);
            addChild(eButton);
            
            var dButton:Sprite=new Sprite();
            var dtf:TextField=new TextField();
            dtf.text="Decode";
            dtf.selectable=false;
            dtf.backgroundColor=0x000000;
            dtf.textColor=0xFFFFFF;
            dtf.background=true;
            dtf.border=true;
            dtf.x=80;
            dtf.y=50;
            dtf.autoSize=TextFieldAutoSize.LEFT;
            dButton.addChild(dtf);
            addChild(dButton);
            
            var rtf:TextField=new TextField();
            rtf.text="";
            rtf.x=130;
            rtf.y=50;
            rtf.width=250;
            rtf.height=30;
            addChild(rtf);
            
            var ef:Function;
	        eButton.addEventListener(MouseEvent.CLICK,ef=function(e:MouseEvent):void{
	        		rtf.text="圧縮前:"+tf.text.length+"文字 , ";
	        		tf.text=rle(tf.text);
	        		rtf.appendText("圧縮後:"+tf.text.length+"文字");
	        });
            var df:Function;
	        dButton.addEventListener(MouseEvent.CLICK,df=function(e:MouseEvent):void{
	        		rtf.text="解凍前:"+tf.text.length+"文字 , ";
	        		tf.text=rld(tf.text);
	        		rtf.appendText("解凍後:"+tf.text.length+"文字");
	        });
        }

        
        public function rle(d:String):String {
			var i:int=0;
			var n:int=0;
			var f:int=0;
			var b:int=0;
			var r:String="";
			var o:String="";
			var w:String="";
			var c:String="";
			var l:int=d.length;
			for(i=0;i<l;i++){
				b=parseInt(d.charAt(i),16)+20;
				c+=b.toString(36);
			}
			for(i=0;i<l;i++){
				w=c.charAt(i);
				if(w==o){
					if(f){
						n++;
					}
					else{
						n=2;
						f=1;
						r+=o;
					}
				}
				else{
					if(f){
						f=0;
						r+=n.toString(20);
					}
					else{
						r+=o;
					}
				}
				o=w;
			}
			r+=f?n.toString(20):o;
			return r;
        }
        public function rld(d:String):String{
			var i:int=0;
			var j:int=0;
			var f:int=0;
			var m:int=0;
			var b:int=0;
			var r:String="";
			var n:String="";
			var l:int=d.length;
			if(parseInt(d.charAt(0),36)<20){
				return d;
			}
			for(i=0;i<l;i++){
				if(parseInt(d.charAt(i),36)>=20){
					if(f){
						m=parseInt(n,20);
						for(j=1;j<m;j++){
							r+=b.toString(16);
						}
						n="";
						f=0;
					}
					b=parseInt(d.charAt(i),36)-20;
					r+=b.toString(16);
				}
				else{
					f=1;
					n+=d.charAt(i);
				}
			
			}
			m=parseInt(n,20);
			for(i=1;i<m;i++){
				r+=b.toString(16);
			}
			return r;  
        }
    }
}