JavaScript中如何转换Long类型?

发布于 2022-09-11 15:11:59 字数 1712 浏览 22 评论 0

我知道JavaScript中并没有Long类型,但是要如何才能将相应的bytes字节码转换为Long类型呢?以下是一段java代码,在java中可以很容易的进行转换,比如

byte [] a = {0x02,0x03, 0x04, 0x05, 0x06,0x07, 0x08, 0x09};
public static long bytesToLong( byte[] array ) {
        if(array.length==0) return 0;
        return ((((long) array[ 0] & 0xff) << 56)
                | (((long) array[ 1] & 0xff) << 48)
                | (((long) array[ 2] & 0xff) << 40)
                | (((long) array[ 3] & 0xff) << 32)
                | (((long) array[ 4] & 0xff) << 24)
                | (((long) array[ 5] & 0xff) << 16)
                | (((long) array[ 6] & 0xff) << 8)
                | (((long) array[ 7] & 0xff) << 0)
        );
    }

以上代码在java中最终输出是: 144964032628459529

我尝试使用JavaScript的Uint8Array以及ArrayBuffer写了一个相对应方法,使用过parseFloat去转换array[]数组,但是并没有成功,下面代码输出的是101125133,苦恼JavaScript没有Long类型转换,该如何是好?王大神支招

    let bcd = new Uint8Array(8)
        bcd[0] = 0x02
        bcd[1] = 0x03
        bcd[2] = 0x04
        bcd[3] = 0x05
        bcd[4] = 0x06
        bcd[5] = 0x07
        bcd[6] = 0x08
        bcd[7] = 0x09
function bytesToLong(array) {
        if (array.length === 0) return 0
        return (((array[0] & 0xff) << 56)
            | ((array[1] & 0xff) << 48)
            | ((array[2] & 0xff) << 40)
            | ((array[3] & 0xff) << 32)
            | ((array[4] & 0xff) << 24)
            | ((array[5] & 0xff) << 16)
            | ((array[6] & 0xff) << 8)
            | ((array[7] & 0xff) << 0))
    }
bytesToLong(bcd)
//输出101125133

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

黯然 2022-09-18 15:12:01

JS 整数超过 2^53 - 1 就不再准确了,且 JS 中位运算都是按 32 位算的,所以不能直接计算。

可以用 Stage 3 的 BigInt 或其它大数库转换。

微暖i 2022-09-18 15:12:01

js没有long,只有64位IEEE754标准的number,你可以把number映射成long,也可以直接就这么存着,写个包装类实现一下四则运算,改用长度为2的Uint32Array存也行。


才知道有个新的BigInt,如果你的目标runtime支持的话应该用这个就可以了。

白鸥掠海 2022-09-18 15:12:01

转不了的,得看你的实际需求进行workaround

坚持沉默 2022-09-18 15:12:01

js没有长整型,短整型的,就一个数值类型

偏爱自由 2022-09-18 15:11:59

使用 BigInt 来替代 Number 类型,代码如下:

const bcd = new Array(8)
bcd[0] = 0x02n
bcd[1] = 0x03n
bcd[2] = 0x04n
bcd[3] = 0x05n
bcd[4] = 0x06n
bcd[5] = 0x07n
bcd[6] = 0x08n
bcd[7] = 0x09n
function bytesToLong (array) {
    if (array.length === 0) return 0
    return (((array[0] & 0xffn) << 56n)
        | ((array[1] & 0xffn) << 48n)
        | ((array[2] & 0xffn) << 40n)
        | ((array[3] & 0xffn) << 32n)
        | ((array[4] & 0xffn) << 24n)
        | ((array[5] & 0xffn) << 16n)
        | ((array[6] & 0xffn) << 8n)
        | ((array[7] & 0xffn) << 0n))
}
console.log(bytesToLong(bcd))

如果希望有正常的兼容性,可以使用 BigInt 库 https://github.com/GoogleChro... 替代;当然也可以使用两个 Number 类型来封装 BigInt 或 Long 类型,加减乘除与或等等都要自己定义,工作量也不小,你可以自己衡量一下

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文