2011-11-08 16 views
9

El nodejs Buffer es bastante swell. Sin embargo, parece estar orientado al almacenamiento de cadenas. Los constructores toman una cadena, una matriz de bytes o un tamaño de bytes para asignar.¿Cómo puedo almacenar un número entero en un Buffer de nodejs?

Estoy utilizando la versión 0.4.12 de Node.js, y quiero almacenar un entero en un búfer. No integer.toString(), pero los bytes reales del entero. ¿Hay una manera fácil de hacer esto sin pasar por encima del número entero y hacer algunos giros de bits? Podría hacer eso, pero siento que este es un problema que alguien más debe haber enfrentado en algún momento.

Respuesta

2

Ya que no es incorporado 0.4.12 usted podría utilizar algo como esto:

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 && 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> 

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

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

+1

Nota: estas API sólo recientemente se han puesto a disposición en la última versión estable de nodo (<4 días atrás). Si todavía está atascado 0.4, necesitará hacer un loop/bit-twiddle para codificar enteros. – wulong

+0

estaban en 0.5.x sin embargo. –

+0

0.5.x nunca fue una versión estable. Actualicé la pregunta para indicar que estoy en 0.4.x, pero tengo un voto favorable para una respuesta que se volverá más útil en el futuro. – jergason

Cuestiones relacionadas