转换 2x32 位 uint <-> 数



如何从2x32位uints转换为数字并返回(假设最大值为2^52)?

我相信以下理论上是可行的(为了清晰起见,可以作为ByteArray传递,但Array也可以作为存储),但它不可行,因为逐位运算符显然会将Number强制转换为32位:\

(请参阅:限制为32位的数字对象的二进制数学?):

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",有人能代表我吗?)

EDIT:也尝试了readDouble()/writeDouble(

好的-这似乎很完美:

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

最新更新