如何将2x32bit uints转换为数字并返回(假设最大值为2 ^ 52)?
我相信以下理论上会起作用(为了清晰起见,传递给ByteArray,但是数组也可以作为存储工作),但它不会因为按位运算符明显强制数字为32位:\
(见:Binary math on Number objects limited to 32 bits?):
public static function read64BitNumberFromBuffer(buffer:ByteArray):Number {
var ch1:uint = buffer.readUnsignedInt();
var ch2:uint = buffer.readUnsignedInt();
var num:Number = ((ch1 << 32) | ch2);
return(num);
}
public static function write64BitNumberToBuffer(num:Number):ByteArray {
var ch1:uint = uint((num & 0xFFFFFFFF00000000) >> 32);
var ch2:uint = uint(num & 0xFFFFFFFF);
var buffer:ByteArray = new ByteArray();
buffer.writeUnsignedInt(ch1);
buffer.writeUnsignedInt(ch2);
return(buffer);
}
可以使用像as3crypto的BigInteger这样的库来处理这个问题,但对于这样一个离散的需求来说,这似乎是一个巨大的膨胀。是否有一些强大的代码可以注入上述函数以使它们返回正确的值?
虽然我更喜欢纯ActionScript解决方案,但作为一个兴趣点 - Crossbridge中的按位运算符也限制为32位? (顺便说一句 - 我需要1500点声望来创建一个标签“crossbridge”,有人可以代表我这么做吗?)
编辑:尝试了readDouble()/ writeDouble(),但似乎想要在更彻底的测试下尝试切换到某些原因来反转字节(尝试使用endian设置,为no除了它确实以错误的方式影响输出之外还有用)
答案 0 :(得分:0)
好的 - 这似乎完美无缺:
package
{
import flash.display.Sprite;
import flash.utils.ByteArray;
public class TEMP extends Sprite
{
public function TEMP()
{
var targetNumber:Number = 6697992365;
var buffer:ByteArray = new ByteArray();
var testNumber:Number;
write64BitNumberToBuffer(buffer, targetNumber);
buffer.position = 0;
testNumber = read64BitNumberFromBuffer(buffer);
if(targetNumber == testNumber) {
trace("Passed! Both numbers are", targetNumber);
} else {
trace("Failed! Test number is", testNumber, "When it should be", targetNumber);
}
}
public static function read64BitNumberFromBuffer(buffer:ByteArray):Number {
var finalNumber:Number;
var str:String = '';
var byte:uint;
var chr:String;
while(str.length < 16) {
byte = buffer.readUnsignedByte();
chr = byte.toString(16);
if(chr.length == 1) {
chr = '0' + chr;
}
str += chr;
}
finalNumber = Number('0x' + str);
return(finalNumber);
}
public static function write64BitNumberToBuffer(buffer:ByteArray, num:Number) {
var hexString:String = num.toString(16);
var idx:uint = 16 - hexString.length;
var byte:uint;
while(idx--) {
hexString = '0' + hexString;
}
for(idx = 0; idx < hexString.length; idx += 2) {
byte = uint('0x' + hexString.substr(idx, 2));
buffer.writeByte(byte);
}
}
}
}
输出:通过!这两个数字都是6697992365