package
kr.as3.byte
{
import
flash.utils.ByteArray;
public
class StringSerializer
{
private const PRESET: Array = [ "V", "e", "z", "h", "E", "2", "g", "Y", "=", "S", "t", "_", "Z", "c", "3", "7", "8", "X", "P", "6", "m", "i", "H", "T", "n", "k", "B", "D", "+", "l", "5", "p", "1", "r", "f", "w", "G", "a", "o", "M", "A", "R", "9", "s", "x", "y", "W", "b", "N", "0", "K", "L", "u", "I", "Q", "F", "C", "O", "-", "U", "q", "d", "v", "4"
];
public function serialize( $data: ByteArray, compress:
Boolean = true ): String
{
var str: String = "";
var data: ByteArray = new ByteArray();
data.writeBytes(
$data );
if( compress == true )
data.compress();
data.position = 0;
var i: int =
0;
var len: int = int(
data.length / 3 );
var
padding: int = data.length - ( len * 3 );
var byte: uint;
str = PRESET[ padding ];
for( i ; i < len ; i += 1 )
{
byte = ( data.readUnsignedByte() << 16 ) + (
data.readUnsignedByte() << 8 ) + data.readUnsignedByte();
str += serialize3Byte( byte );
}
if( padding == 1 )
{
byte = ( data.readUnsignedByte() << 16
);
str += serialize3Byte( byte );
}
else if( padding == 2
)
{
byte = ( data.readUnsignedByte()
<< 16 ) + ( data.readUnsignedByte() << 8 );
str += serialize3Byte( byte );
}
return str;
}
public function unserialize( $string: String, compressed:
Boolean = true ): ByteArray
{
var data: ByteArray =
new ByteArray();
var padding: int = PRESET.indexOf(
$string.charAt( 0 ) );
var i: int = 0;
var len: int = int( $string.length / 4 );
len -= padding == 0 ? 0 : 1;
var byte: uint;
for( i ; i < len ; i += 1 )
{
byte = unserialize4String( $string.slice( i*4 + 1,
i*4 + 5 ) );
data.writeByte( ( byte >> 16 ) &
0xFF );
data.writeByte( ( byte >> 8 ) & 0xFF
);
data.writeByte( byte & 0xFF );
}
if(
padding == 1 )
{
byte =
unserialize4String( $string.slice( i*4 + 1, i*4 + 5 ) );
data.writeByte( ( byte >> 16 ) & 0xFF );
}
else if( padding == 2 )
{
byte = unserialize4String( $string.slice( i*4 + 1,
i*4 + 5 ) );
data.writeByte( ( byte >> 16 ) &
0xFF );
data.writeByte( ( byte >> 8 ) & 0xFF
);
}
if( compressed == true )
data.uncompress();
return data;
}
private const
BITS: uint = 0x3F;
private function
serialize3Byte( bytes: uint ): String
{
var str: String = PRESET[ ( bytes >> 18 )
& BITS ] + PRESET[ ( bytes >> 12 ) & BITS ] + PRESET[ ( bytes
>> 6 ) & BITS ] + PRESET[ bytes & BITS ];
return str;
}
private function unserialize4String( str: String ):
uint
{
var
value: uint = ( uint( PRESET.indexOf( str.charAt( 0 ) ) ) << 18
) + ( uint( PRESET.indexOf( str.charAt( 1 ) ) ) << 12 ) + ( uint(
PRESET.indexOf( str.charAt( 2 ) ) ) << 6 ) + uint( PRESET.indexOf(
str.charAt( 3 ) ) );
return value;
}
}
} |
|