web-dev-qa-db-ja.com

整数をnodejsバッファーに格納するにはどうすればよいですか?

Nodejs Buffer はかなりうねっています。ただし、文字列を格納するように調整されているようです。コンストラクターは、文字列、バイトの配列、またはバイトサイズを使用して割り当てます。

Node.jsのバージョン0.4.12を使用していて、整数をバッファーに格納したい。 integer.toString()ではなく、整数の実際のバイト数。整数をループしたりビットをいじったりせずにこれを行う簡単な方法はありますか?私はそれをすることができましたが、これは誰かがいつか直面したはずの問題だと感じています。

20
jergason

組み込みの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 && 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>

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

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

35
Chris Biscardi

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関数がノードv0.5.5で追加されました。

よりよく理解するためにこれらのドキュメントを見てください:
バッファ
writeUInt16BE/LE
writeUIntBE/LE
allocUnsafe

4
MattClimbs