在NodeJS中复制Buffer的问题

时间:2012-06-07 14:21:12

标签: javascript node.js buffer

我正在尝试创建附加缓冲区的方法。

这是代码,结果非常奇怪:

   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

我做错了什么?

1 个答案:

答案 0 :(得分: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;
  }

你做错了什么? 你试图在内存中操纵固定大小分配的长度 + =方法。因此它抛出了异常,因为+ =运算符显然没有重新分配内存

* 我们在这做什么*

非常简单,我们只是从参数缓冲区中创建一个新的缓冲区。