将字节数组解码为最多64位的有符号整数

时间:2018-06-19 15:17:55

标签: javascript arrays binary numbers

我知道JavaScript不能精确地表示所有64位整数。但是它可以精确地表示大于32位的数字。这就是我所需要的。 JavaScript可以给我任何精度。

我有一个已知长度的字节数组。它具有1、2、4、8或16个字节。它可以包含有符号或无符号整数,我知道它是。数据是big-endian(网络字节顺序)。

如何从该字节数组中获取数字值?

有些简单的隔离会因负数而完全失效。超过32位的DataView毫无帮助。我对一个不错的,简单且可取的高效纯JavaScript解决方案感兴趣。在我可见的网络部分,似乎没有任何解决方案。

万一有人想看错代码,这是我的正数版本:

function readInt(array) {
    var value = 0;
    for (var i = array.length - 1; i >= 0; i--) {
        value = (value * 256) + array[i];
    }
    return value;
}

1 个答案:

答案 0 :(得分:0)

This page解释了一个很好而简单的解决方案:

  • 将从右端开始的所有位加起来,直到第二个最高有效位。
  • 最高有效位不是2 ^ i,而是-2 ^ i。

我的代码在更大的范围内工作,该范围具有一个数组和一个要读取的pos。

function readInt(size) {
    var value = 0;
    var first = true;
    while (size--) {
        if (first) {
            let byte = array[pos++];
            value += byte & 0x7f;
            if (byte & 0x80) {
                value -= 0x80;   // Treat most-significant bit as -2^i instead of 2^i
            }
            first = false;
        }
        else {
            value *= 256;
            value += array[pos++];
        }
    }
    return value;
}

arrayUint8Array)中提供了原始字节,pos是下一个要读取的索引。该功能从当前的pos开始读取,并在读取pos字节之一时前进size