最近做的一个项目需要从服务端的二进制数据里面读取一个Long型。在国外的网站上发现了一个解决方案,修改一下解决问题。
基本思路是Long型是64位用readByte()读取8回累加为一个16进制的String,然后转换为Number
代码如下
package com.pizzaman.utils {
import flash.utils.ByteArray;
public class PizzaByteArray extends ByteArray {
public function PizzaByteArray(){
super();
}
public function readLong():Number{
var long:String = "";
for (var i:int = 0; i < 8; i++)
long += this.readByte().toString(16);
trace(long);
return Number(convertLongToDecimal(long, 16));
}
private function covLongToNum( value:String, radix:uint=2 ):String {
var cluster:int = Math.round( Math.log(uint.MAX_VALUE) / Math.log(radix));
if(value.length > cluster * 2) throw new Error("value is more then 64-bits");
var hs:String = value.slice(0,-cluster);
var ls:String = value.slice(-cluster);
var i:int;
for(i = 0; i < cluster; i++){
hs += "0";
}
var high:Number = parseInt(hs, radix);
var low:Number = parseInt(ls, radix);
var dec:String = "";
var base:int = 10;
i = 20;
while(i--){
var tenn:Number = Math.pow(base, i);
var div:Number = Math.floor( (high / tenn) + (low / tenn) );
dec += div.toString();
div *= tenn;
var h:Number = Math.floor( div / uint.MAX_VALUE ) * (uint.MAX_VALUE + 1);
var l:Number = div - h;
high -= h;
low -= l;
}
while(dec.charAt(0) == "0") dec = dec.slice(1);
return dec;
}
}
}