web-dev-qa-db-ja.com

JavaScript:3バイトのバッファーを整数として読み取る

16進データストリームがあり、これを3バイトブロックに分割し、整数として読み取る必要があるとします。

たとえば、16進文字列01be638119704d4b9a最初の3バイトを読む必要があります01be63および整数として読み取る114275。これは私が得たものです:

var sample = '01be638119704d4b9a';
var buffer = new Buffer(sample, 'hex');
var bufferChunk = buffer.slice(0, 3);
var decimal = bufferChunk.readUInt32BE(0);

readUInt32BEは4バイトのデータに対して完全に機能しますが、ここでは明らかに以下を取得します。

RangeError: index out of range
  at checkOffset (buffer.js:494:11)
  at Buffer.readUInt32BE (buffer.js:568:5)

3バイトを整数として正しく読み取るにはどうすればよいですか?

16
kmachnicki

Node.js v0.12 +またはio.jsを使用している場合、 buffer.readUIntBE() があり、可変バイト数が許可されます。

var decimal = buffer.readUIntBE(0, 3);

(ビッグエンディアンの場合はreadUIntBE、リトルエンディアンの場合はreadUIntLEです)。

それ以外の場合、古いバージョンのノードを使用している場合は、手動で行う必要があります(もちろん最初に境界を確認してください):

var decimal = (buffer[0] << 16) + (buffer[1] << 8) + buffer[2];
32
mscdex

私はこれを使用しています。誰かが何か間違ったことを知っている場合は、アドバイスしてください。

const integer = parseInt(buffer.toString("hex"), 16)
1
Ernest Okot