readInt32BEがInt32を読み取るように、node.jsバッファーからNumberプリミティブにInt64BEを読み取るための最良の方法は何でしょうか。
数値+/-9'007'199'254'740'992で精度が低下することはわかっていますが、実装したいプロトコルではそれほど高い数値は得られません。
readInt32BEがInt32を読み取るように、node.jsバッファーからNumberプリミティブにInt64BEを読み取るための最良の方法は何でしょうか。
数値+/-9'007'199'254'740'992で精度が低下することはわかっていますが、実装したいプロトコルではそれほど高い数値は得られません。
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;
}
自分で変換をコーディングしようとしないでください。のようなテスト済みバージョンを使用してくださいnode-int64
。
var Int64 = require('node-int64');
function readInt64BEasFloat(buffer, offset) {
var int64 = new Int64(buffer, offset);
return int64.toNumber(true);
}
buf.readBigInt64BE
最新のNode.js(12.0.0)では、 :))を使用できます。