2012-06-07 2 views
1

Я пытаюсь создать метод добавления буферов.Проблемы с копированием Буфера в NodeJS

Вот код, который занимает очень странный результат:

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 

Что мне делать неправильно?

+0

Функция работает хорошо для меня:/ – ShrekOverflow

+0

Какая версия node.js это? – ShrekOverflow

+0

Я не уверен, что желательно изменить длину буфера, как это, я действительно удивлен тем, что Node даже позволяет это. – lanzz

ответ

5

: EDIT:

запуталась вопросом. Я думал, что он будет обрабатывать буферы того же типа.

Буфера наклоняют быть изменены, поскольку они определяются фиксированным размером в 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; 
    } 

Что вы делали неправильно? Вы пытались манипулировать длиной выделения фиксированного размера в памяти методом + =. Поэтому выбросил исключение Beacause оператор + =, очевидно, Didnt повторно выделенной памяти

* Что мы здесь делаем *

Довольно просто мы просто сделать новый буфер из аргументов буферов.

+0

В результате переменная «a» становится строкой, а не буфером. Это хорошо, когда вы работаете со строками, но неправильно, когда работаете с бинарными буферами. – idzikovsky

+0

из вашего примера я запутался> _> – ShrekOverflow

+0

@ user805222 Я отредактировал его для того, что вам нужно – ShrekOverflow

Смежные вопросы