JavaScript: чтение 3 байта Буфер как целое число

Скажем, у меня есть шестнадцатеричный поток данных, который я хочу разделить на 3-байтовые блоки, которые мне нужно читать как целое.

Например: с заданной шестнадцатеричной строкой 01be638119704d4b9a Мне нужно прочитать первые три байта 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 байта как целое?

Ответ 1

Если вы используете node.js v0. 12+ или io.js, существует buffer.readUIntBE() который допускает переменное число байтов:

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

(Обратите внимание, что это readUIntBE для Big Endian и readUIntLE для Little Endian).

В противном случае, если вы используете более старую версию узла, вам придется сделать это вручную (сначала проверьте границы):

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

Ответ 2

Я использую это, если кто-то знает что-то не так с этим, пожалуйста, сообщите;

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

Ответ 3

вы должны преобразовать три байта в четыре байта.

function three(var sample){
    var buffer = new Buffer(sample, 'hex');

    var buf = new Buffer(1);
    buf[0] = 0x0;

    return Buffer.concat([buf, buffer.slice(0, 3)]).readUInt32BE();
}

Вы можете попробовать эту функцию.