16進文字列→36進連長圧縮
16進数文字列←→36進数連長圧縮
rle(hex)→36rle
rld(36rle)→hex
16進数でゲームのリプレイデータを記録したりする場合に使えるかもしれない
ちょっといじれば16進数じゃなくてもできますし。
/*
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;
}
}
}