2016-06-30 20 views
1

Node.jsの2つのバッファの間にスペースを入れて連結しようとしています。node.jsにデリミタ付きバッファを連結する方法は?

ここに私のコードです。

var buff1 = new Buffer("Jumping"); 
var buff2 = new Buffer("Japang"); 
var buffSpace = new Buffer(1); 
buffSpace[0] = "32"; 
var newBuff = Buffer.concat([buff1, buffSpace, buff2], (buff1.length + buff2.length + buffSpace.length)); 
console.log(newBuff.toString()); 

最初の引数は、バッファオブジェクトの配列リストです。したがって、私はbuffSpaceを作成しました。

に連結されたときバッファ数合計の長さ:Buffer.concat(リスト[、totalLength])は
リスト:バッファオブジェクトの配列リスト
totalLengthを連結するために、クラスメソッド

私は期待どおりの結果を得ていますが、それが正しいかどうかは不明です。同じことを達成するためのよりよい解決策があるかどうかをご提案ください。

答えて

2

私が提案する3つの変更点があります。

ノードv6を使用している場合は、new Buffer()ではなくBuffer.from()the latter is deprecatedとして使用します。

第2に、totalLengthBuffer.concat()の引数を渡す必要はありません。これは、渡されたすべてのバッファの長さからit will be calculated automaticallyです。ドキュメントでは、全長を渡す方が速いことに注意していますが、これは実際には一定の値を渡す場合にのみ当てはまります。あなたが上でやっていることは、長さを計算してそれを渡すことです。これは、concat()関数が内部的に何をするのかです。

最後に、これはArray.prototype.join()のように機能するバッファに入れることをお勧めします。

function joinBuffers(buffers, delimiter = ' ') { 
    let d = Buffer.from(delimiter); 

    return buffers.reduce((prev, b) => Buffer.concat([prev, d, b])); 
} 

そして、あなたはこのようにそれを使用することができます:

let buf1 = Buffer.from('Foo'); 
let buf2 = Buffer.from('Bar'); 
let buf3 = Buffer.from('Baz'); 

let joined = joinBuffers([buf1, buf2, buf3]); 

console.log(joined.toString()); // Foo Bar Baz 

またはこのようなカスタム区切り文字を設定します。

let joined2 = joinBuffers([buf1, buf2, buf3], ' and '); 

console.log(joined2.toString()); // Foo and Bar and Baz 
+1

ありがとうございました。私はまだv0.12.xを使っていてv4.xに移行しているので、私はv6.xに移行するまで新しいバッファ()にとどまっています。ところで素晴らしい提案。ありがとうございました:) – Kikit

+1

@Kikit「Buffer.from()」がNode <= 4でも使用できないことを指摘してくれてありがとうございました。それは私の見解であり、それに応じて私の答えを編集しました。 – McMath

+1

また、矢印機能とデフォルトパラメータ値は、v4からノードで使用可能なES6の一部です。 v0.12.xでサポートされているArrow機能のいくつかの機能は、 '--harmony'フラグを使用しています。 [Check Here](http://node.green/) – Kikit

関連する問題