转换2x32位uint< - >数

时间:2014-02-13 15:36:52

标签: actionscript-3 flash

如何将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除了它确实以错误的方式影响输出之外还有用)

1 个答案:

答案 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