2

readInt32BEがInt32を読み取るように、node.jsバッファーからNumberプリミティブにInt64BEを読み取るための最良の方法は何でしょうか。

数値+/-9'007'199'254'740'992で精度が低下することはわかっていますが、実装したいプロトコルではそれほど高い数値は得られません。

4

3 に答える 3

8

Javascriptは、64ビットの倍精度浮動小数点数のみを使用します。長い数値を読み取るには、2つの32ビット整数を読み取り、上位32ビットを左にシフトする必要があります。また、内部表現では符号に1ビット、指数に11ビットが使用されるため、9007199254740992 <= x<=-9007199254740992の範囲外の長い値では情報が失われる可能性があることに注意してください。

下部は負の値になる可能性がありますが、符号なしとして扱われる必要があるため、修正が追加されます。

function readInt64BEasFloat(buffer, offset) {
  var low = readInt32BE(buffer, offset + 4);
  var n = readInt32BE(buffer, offset) * 4294967296.0 + low;
  if (low < 0) n += 4294967296;
  return n;
}
于 2012-12-22T11:12:02.457 に答える
5

自分で変換をコーディングしようとしないでください。のようなテスト済みバージョンを使用してくださいnode-int64

var Int64 = require('node-int64');
function readInt64BEasFloat(buffer, offset) {
  var int64 = new Int64(buffer, offset);
  return int64.toNumber(true);
}
于 2012-12-22T15:00:50.980 に答える
3

buf.readBigInt64BE最新のNode.js(12.0.0)では、 :))を使用できます。

于 2019-04-24T10:48:00.393 に答える