2017-01-16 2 views
1

Скажем, у меня есть простой буфер в Node.js так:Canonical способ удалить несколько байт из буфера

const bytes = Buffer.from('abcdefg'); 

этот экземпляр буфер имеет slice и concat как методы, но я действительно не знаю, как использовать они в основном создают функциональность pop/shift/splice массива.

вот Buffer документы: https://nodejs.org/api/buffer.html

То, что я в основном хотят сделать, это прочитать/удалить первый X число байтов, например, так:

function read(x){ 

// return the first x number of bytes from buffer 
// and remove those bytes from the buffer 
// side-effects be damned for the moment 
} 

вот что у меня есть, но это, кажется, довольно «неправильный» для меня, хотя он также работает:

let items = Buffer.from('abcdefg'); 

function read(x){ 
    const b = items.slice(0,x); 
    items = items.slice(x,items.length); 
    return b; 
} 

console.log(String(read(4))); 
console.log(String(items)); 

Есть ли лучший способ сделать это?

Кроме того, я не уверен, что чтение является правильным словом, но поп будет означать массив ... какое правильное слово использовать для описания того, что делает эта функция?

ответ

9

От Node.js API:

Экземпляры класса Buffer похожи на массивы целых чисел, но соответствуют фиксированного размера, сырые распределения памяти вне кучи V8. Размер буфера устанавливается, когда он создан и не может быть изменен.

Именно поэтому нет .pop() метода Buffer, потому что это не операция на то, что фиксированный размере в природе, в отличии от массива. То же самое касается shift и splice. Вы не можете расширить уже выделенные Buffer, но вы можете создавать новые.

Использование .slice() не даст вам нового Buffer, вместо этого возвращает подмножество памяти, занимаемой оригиналом Buffer. Хотя этот подход работает, возможно, существует вероятность того, что какая-то другая переменная все еще ссылается на оригинал Buffer, и в этом случае изменения, внесенные в подмножество, которое вы получили от .slice(), могли переноситься и на оригинал Buffer.

Учитывая характер Buffer и виды операций, которые вам кажутся нужными, лучше всего преобразовать items в строку. Затем вы можете выполнить все операции, упомянутые вами, путем разделения с помощью .split(''). Как только вы закончите, вы можете присоединиться к разделенной строке и создать новый Buffer с использованием Buffer.from(string) и назначить его обратно items. Таким образом, ваш код будет намного понятнее.

+0

безупречный ответ .. – Deep

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