JavaScript:读取8个字节到64位整数

时间:2013-01-07 16:34:31

标签: javascript node.js integer buffer byte

我有一个包含8个字节的缓冲区对象。现在应将这八个字节解释为64位整数。

目前我使用以下算法:

var int = buff[0];

for (var i = 1; i < buff.length; i++) {
    int += (buff[i] * Math.pow(2, 8 * i));
}

console.log(int);

这有效但我相信有更好的方法(可能使用Uint64Array)。

不幸的是我无法找到Uint16Array如何帮助我。

此致

更新

// puts two 32bit integers to one 64bit integer
var bufInt = (buf.readUInt32BE(0) << 8) + buf.readUInt32BE(4);

6 个答案:

答案 0 :(得分:7)

Javascript不支持64位整数,因为本机数字类型是64位双精度,只给出53位整数范围。

您可以创建32位数字的数组(即Uint32Array),但如果有64位版本的数据,则无法将值复制到独立变量中。

答案 1 :(得分:2)

您可以使用node-int64进行64位整数支持:

var Int64 = require('node-int64');
var int64 = new Int64(buff);

答案 2 :(得分:1)

遗憾的是,正确答案是Javascript不支持64位整数(到现在为止)。

因此,尝试将存储到您的8个字节中的精确64位整数转换为单个JS数字类型变量将失败。反正。

一些决定:

  1. 0到52之间的确切位:
  2. 如果你不需要64位的高位11位并且你需要处理精确的53位整数,你可以这样使用:

    // puts up to 53 bits by 32bit integers to one "64bit" integer
    var bufInt = (buf.readUInt32BE(0) & 0x001FFFFF) * 4294967296 + buf.readUInt32BE(4);
    

    (已编辑的问题)

    1. “64bit”int可能松散低11位正确状态:
    2. 否则,如果你需要64bit的“常用大值”并且你对11位低位(最右边2-3位的64位大值)的精确值不感兴趣,你可以这样使用:

      // puts 64 bit value by 32bit integers to one "64bit" integer
      // with possible loose of lower 11 bits correctness
      var bufInt = buf.readUInt32BE(0) * 4294967296 + buf.readUInt32BE(4);
      

      对于那些对Javascript感兴趣的int64(64位整数支持)感兴趣的人,请注意!

      查找

      var x1 = 1 << 30;
      var x2 = 1 << 31;
      var x3 = 1 << 32;
      var x4 = 1 << 33;
      var a = 1240611072103715194;
      var b = 1240611072103715193;
      var c = 1240611072103700000;
      alert(''
          + 'x1=' + x1 + ' (should =1073741824)\n' 
          + 'x2=' + x2 + ' (should =2147483648)\n' 
          + 'x3=' + x3 + ' (should =4294967296)\n' 
          + 'x4=' + x4 + ' (should =8589934592)\n' 
          + 'a=' + a + ' (should =1240611072103715194)\n' 
          + 'a-b=' + (a-b) + ' (should =1)\n'
          + 'a-c=' + (a-c) + ' (should =15194)\n'
      );
      
      RESULT:
      
      x1=1073741824 (should =1073741824)
      x2=-2147483648 (should =2147483648)
      x3=1 (should =4294967296)
      x4=2 (should =8589934592)
      a=1240611072103715000 (should =1240611072103715194)
      a-b=0 (should =1)
      a-c=15104 (should =15194)
      

答案 3 :(得分:1)

由于 javascript 不支持 64 位整数,这里有一个对我有用的解决方案。这里我正在转换 8 字节 unix 时间戳。

inputString = "0000016b40d8ea30"    
var buf = Buffer.from(inputString, 'hex');
timestamp = (parseInt(buf.toString("hex"),16).toString());
console.log(timestamp); //1560161086000

答案 4 :(得分:0)

有一些模块可以提供64位整数支持:

也许你的问题可以使用其中一个库来解决。

答案 5 :(得分:0)

自从最新的Node.js v12.0.0起,您现在可以使用buf.readBigUInt64LE:))