1

バッファを追加するメソッドを作成しようとしています。

これが非常に奇妙な結果をもたらすコードです:

   var offset = 0
   var a = new Buffer(0)
   var b = new Buffer('test')

   offset = a.length
   a.length += b.length
   a.copy(b, offset)
   console.log(a.toString())
   // everything works normaly
   // returns: test

   b = new Buffer('hello')
   offset = a.length
   a.length += b.length
   a.copy(b, offset)
   console.log(a.toString())
   // code the same
   // but returns: test<Buff
   // nor: testhello

   // at the third time code doesn't works and raise error: targetStart out of bounds

私は何を間違えますか?

4

1 に答える 1

5

:編集:

質問に混乱しました。彼は同じタイプのバッファを処理するつもりだと思いました。

バッファはNode.jsで固定サイズで定義されているため、サイズを変更できないため、次のような関数を使用するのが最適なオプションです。

   function concat(buffers) {

    if (!Array.isArray(buffers)) {
      buffers = Array.prototype.slice.call(arguments);
    }

    var buffersToConcat = [], length = 0;
    buffers.forEach(function (buffer) {
        if (!Buffer.isBuffer(buffer)) {
          buffer = new Buffer(buffer);
        }
        length += buffer.length;
        buffersToConcat.push(buffer);
    });

    var concatinatedBuffer = new Buffer(length), index = 0;
    buffersToConcat.forEach(function (buffer) {
      buffer.copy(concatinatedBuffer, index, 0, buffer.length);
      index += buffer.length;
    });

    return concatinatedBuffer;
  }

何が間違っていたのですか? +=メソッドによってメモリ内の固定サイズ割り当ての長さを操作しようとしていました。したがって、+ =演算子が明らかにメモリを再割り当てしなかったため、例外がスローされました。

*ここで何をしていますか*

非常に単純なことですが、引数バッファーから新しいバッファーを作成しているだけです。

于 2012-06-07T14:34:51.860 に答える