Как я могу сохранить целое число в буфере nodejs?

#node.js #buffer

#node.js #буфер

Вопрос:

Nodejs Buffer довольно хорош. Однако, похоже, он предназначен для хранения строк. Конструкторы либо принимают строку, массив байтов, либо размер байтов для выделения.

Я использую версию 0.4.12 Node.js , и я хочу сохранить целое число в буфере. Не integer.toString() , а фактические байты целого числа. Есть ли простой способ сделать это без зацикливания на целом числе и некоторого изменения битов? Я мог бы это сделать, но я чувствую, что с этой проблемой когда-то должен был столкнуться кто-то другой.

Ответ №1:

 var buf = new Buffer(4);
buf.writeUInt8(0x3, 0);
  

http://nodejs.org/docs/v0.6.0/api/buffers.html#buffer.writeUInt8

Комментарии:

1. Примечание: эти API только недавно стали доступны в последней стабильной версии node (<4 дней назад). Если вы все еще застряли на 0.4, вам нужно выполнить цикл / битовое переключение, чтобы закодировать целые числа.

2. 0.5.x никогда не был стабильной версией. Я обновил вопрос, чтобы указать, что я нахожусь на 0.4.x, но проголосовал за ответ, который станет более полезным в будущем.

3. Конечно, при этом будет записан только один байт. Как насчет 32-битного int?

Ответ №2:

С более свежими версиями Node это намного проще. Вот пример для 2-байтового целого числа без знака:

 let buf = Buffer.allocUnsafe(2);
buf.writeUInt16BE(1234);  // Big endian
  

Или для целого числа со знаком 4 байта:

 let buf = Buffer.allocUnsafe(4);  // Init buffer without writing all data to zeros
buf.writeInt32LE(-123456);  // Little endian this time..
  

Различные writeInt функции были добавлены в node версии 0,5.5.5.

Взгляните на эти документы для лучшего понимания:
Buffer
writeUInt16BE /ФАЙЛ
writeUIntBE / ФАЙЛ
allocUnsafe

Ответ №3:

Поскольку он не встроен в 0.4.12, вы могли бы использовать что-то вроде этого:

 var integer = 1000;
var length = Math.ceil((Math.log(integer)/Math.log(2))/8); // How much byte to store integer in the buffer
var buffer = new Buffer(length);
var arr = []; // Use to create the binary representation of the integer

while (integer > 0) {
    var temp = integer % 2;
    arr.push(temp);
    integer = Math.floor(integer/2);
}

console.log(arr);

var counter = 0;
var total = 0;

for (var i = 0,j = arr.length; i < j; i  ) {
   if (counter % 8 == 0 amp;amp; counter > 0) { // Do we have a byte full ?
       buffer[length - 1] = total;
       total = 0;
       counter = 0;
       length--;      
   }

   if (arr[i] == 1) { // bit is set
      total  = Math.pow(2, counter);
   }
   counter  ;
}

buffer[0] = total;

console.log(buffer);


/* OUTPUT :

racar $ node test_node2.js 
[ 0, 0, 0, 1, 0, 1, 1, 1, 1, 1 ]
<Buffer 03 e8>

*/