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();
}
Вы можете попробовать эту функцию.