2011-11-08 35 views
9

Nút nodejs Buffer khá nổi bật. Tuy nhiên, nó dường như được hướng tới việc lưu trữ các chuỗi. Các hàm tạo hoặc lấy một chuỗi, một mảng các byte hoặc một kích thước các byte để cấp phát.Làm cách nào để lưu trữ một số nguyên trong bộ đệm của nút đệm?

Tôi đang sử dụng phiên bản 0.4.12 của Node.js và tôi muốn lưu trữ một số nguyên trong bộ đệm. Không phải integer.toString(), nhưng byte thực của số nguyên. Có cách nào dễ dàng để làm điều này mà không lặp qua số nguyên và làm một số bit-twiddling? Tôi có thể làm điều đó, nhưng tôi cảm thấy như đây là một vấn đề mà người khác phải đối mặt vào một lúc nào đó.

Trả lời

2

Vì nó không được xây dựng trong 0.4.12 bạn có thể sử dụng một cái gì đó như thế này:

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

Lưu ý: các API đã chỉ gần đây đã được tạo sẵn trong phiên bản ổn định mới nhất của nút (<4 ngày trước. Nếu bạn vẫn bị kẹt 0.4, bạn sẽ cần loop/bit-twiddle để mã hóa các số nguyên. Tuy nhiên, – wulong

+0

chúng ở mức 0.5.x. –

+0

0.5.x chưa bao giờ là bản phát hành ổn định. Tôi đã cập nhật câu hỏi để cho biết tôi đang ở trên 0.4.x, nhưng có một câu trả lời cho câu trả lời sẽ phát triển hữu ích hơn trong tương lai. – jergason

Các vấn đề liên quan