将javascript Integer转换为字节数组并返回

新手上路,请多包涵
function intFromBytes( x ){
    var val = 0;
    for (var i = 0; i < x.length; ++i) {
        val += x[i];
        if (i < x.length-1) {
            val = val << 8;
        }
    }
    return val;
}

function getInt64Bytes( x ){
    var bytes = [];
    var i = 8;
    do {
    bytes[--i] = x & (255);
    x = x>>8;
    } while ( i )
    return bytes;
}

我正在尝试将 javascript 数字转换为字节数组,然后再转换回数字。但是,上述函数会产生非常大的错误输出。

 var array = getInt64Bytes(23423423);
var value = intFromBytes(array);

console.log(value); //Prints 23423423 - correct

var array = getInt64Bytes(45035996273704);
var value = intFromBytes(array);

console.log(value); //Prints -1030792152 - incorrect

据我了解,javascript 浮点数是 53 位,所以它不应该溢出? alert(Math.pow(2,53)) 工作正常。

原文由 user75832 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 579
2 个回答

在 JavaScript 中,移位( >><< )总是对带符号的 32 位整数执行。这会导致大数的范围溢出。

原文由 Crozin 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 Susanoh13 提供的提示,这里有两个允许将数字从 ByteArray 转换为/到 ByteArray 的函数:

 longToByteArray = function(/*long*/long) {
    // we want to represent the input as a 8-bytes array
    var byteArray = [0, 0, 0, 0, 0, 0, 0, 0];

    for ( var index = 0; index < byteArray.length; index ++ ) {
        var byte = long & 0xff;
        byteArray [ index ] = byte;
        long = (long - byte) / 256 ;
    }

    return byteArray;
};

byteArrayToLong = function(/*byte[]*/byteArray) {
    var value = 0;
    for ( var i = byteArray.length - 1; i >= 0; i--) {
        value = (value * 256) + byteArray[i];
    }

    return value;
};

原文由 Younes 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题