代码之家  ›  专栏  ›  技术社区  ›  ygoe

将字节数组解码为高达64位的有符号整数

  •  -2
  • ygoe  · 技术社区  · 6 年前

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

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

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

    有些简单的孤子在负数时完全失效。对于超过32位的数据视图没有任何帮助。我对一个好的、简单的、更好的、高效的纯javascript解决方案感兴趣。在我可见的网络部分似乎没有任何解决方案。

    如果有人想看到错误的代码,这里是我的正数版本:

    function readInt(array) {
        var value = 0;
        for (var i = array.length - 1; i >= 0; i--) {
            value = (value * 256) + array[i];
        }
        return value;
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   ygoe    6 年前

    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;
    }
    

    原始字节提供在 array (A) Uint8Array ) pos 是要读取的下一个索引。此函数在当前 销售时点情报系统 进展 销售时点情报系统 当它读到 size 字节。