Flash 从两个单元中获取数字

Flash 从两个单元中获取数字,flash,actionscript-3,math,numbers,integer,Flash,Actionscript 3,Math,Numbers,Integer,我在Flash+ActionScript3中从网络中读取一个带符号的64位整数(Javalong),并将其存储为两个uint(第一个和最后一个32位) 如何将其转换为实际数字作为数字 我知道Number只能包含53位整数,而不是64位整数,但这已经足够了(尽管在转换较大的数字时能够抛出错误也不错)。 upd: var ba:ByteArray = new ByteArray(); ba.writeUnsignedInt(uint1); ba.writeUnsignedInt(uint2); ba

我在Flash+ActionScript3中从网络中读取一个带符号的64位整数(Java
long
),并将其存储为两个
uint
(第一个和最后一个32位)

如何将其转换为实际数字作为
数字

我知道
Number
只能包含53位整数,而不是64位整数,但这已经足够了(尽管在转换较大的数字时能够抛出
错误也不错)。


upd:

var ba:ByteArray = new ByteArray();
ba.writeUnsignedInt(uint1);
ba.writeUnsignedInt(uint2);
ba.position = 0;
result = ba.readDouble();
我找到了自己的解决方案(仅适用于正数)

(数字(msb)*数学功率(2,32))+数字(lsb)

或硬编码2^32

(数字(msb)*4294967296)+Number(lsb)

是的,readDouble()在这里是无用的,它将把您的64位整数解释为IEEE 754格式的双精度浮点(符号位+11指数位+52分数位),这将得到一个垃圾结果

(Number(msb)*Math.pow(2,32))+Number(lsb)如果需要支持负数,则不是一个完整的解决方案。此代码仅在数字为零或正数不大于2^63-1(因此未设置符号位)时才会获得正确的结果。如果设置了符号位,您的代码将有效地将64位解释为无符号整数,这不是Java发送给您的。如果你正在使用你的解决方案,并且想知道为什么你总是得到积极的结果,这就是为什么

可能有一些非常酷的技巧可以在一行代码中支持负数和正数,但由于我现在无法解决这个问题,我将告诉您我心目中的解决方案:

我将使用msb&0x8000000读取符号位。如果未设置,请使用上面的公式。如果已设置,请先将数字从2的补码格式转换为无符号格式:

msb=(msb^0xFFFFFF)

lsb=(lsb^0xFFFFFFFF)+1

然后将forumla应用于msb和lsb,并(因为已设置符号位)将结果数乘以-1

if (msb & 0x80000000)
{
    msb ^= 0xFFFFFFFF;
    lsb ^= 0xFFFFFFFF;
    result = -(Number(msb)*4294967296 + Number(lsb) + 1);
}
else
{
    result = Number(msb)*4294967296 + Number(lsb);
}

如果我做了
(msb我实际上没有使用负数,即使这个数字是有符号的,但很高兴知道我是否使用过负数。只是提醒一下,我在计算中删除了符号位归零步骤,这是我思考过程的一部分,但不是实际计算的一部分——这会作为XORing的一部分自动发生。如果有负int,则所有我们要做的就是翻转所有的位,加上一个,得到2的补码,这就给出了通过forumla时负数的绝对值,然后乘以-1得到实际值。
if (msb & 0x80000000)
{
    msb ^= 0xFFFFFFFF;
    lsb ^= 0xFFFFFFFF;
    result = -(Number(msb)*4294967296 + Number(lsb) + 1);
}
else
{
    result = Number(msb)*4294967296 + Number(lsb);
}