【问题标题】:Decode a byte array to a signed integer up to 64 bit将字节数组解码为最多 64 位的有符号整数
【发布时间】:2018-11-28 14:52:00
【问题描述】:

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

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

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

有一些简单的孤立点在负数上完全失败。有超过 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;
}

【问题讨论】:

  • 到目前为止你尝试过什么?另外,你的数组的字节序是什么?
  • 我添加了错误的代码。数据是大端的。
  • 当它是大端时,你为什么要向后迭代?
  • 正如我所说,这段代码不起作用。我已经从另一个 SO 答案中复制了它。
  • 您是否尝试过以另一种方式迭代 for (var i = 0; i < array.length; i++) { ? PS:当您只是从另一个帖子中复制并声称它不起作用时,这并不是您对该主题的尝试或想法。

标签: javascript arrays binary numbers


【解决方案1】:

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

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

我的代码在更大的范围内工作,该范围有一个数组和一个可供读取的位置。

函数 readInt(size) {
    变量值 = 0;
    var first = true;
    而(大小--){
        如果(第一){
            让字节=数组[pos++];
            值 += 字节 & 0x7f;
            如果(字节和 0x80){
                值-= 0x80; // 将最高有效位视为 -2^i 而不是 2^i
            }
            第一=假;
        }
        别的 {
            值 *= 256;
            值 += 数组[pos++];
        }
    }
    返回值;
}

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

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多