2017-01-16 2 views
1

Dire que j'ai simple tampon dans Node.js comme ceci:manière canonique pour supprimer plusieurs octets de mémoire tampon

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

cette instance de tampon a slice et concat comme méthodes, mais je ne suis vraiment pas sûr de savoir comment utiliser ceux-ci créent fondamentalement la fonctionnalité de pop/shift/splice d'un tableau.

ici sont les docs tampon: https://nodejs.org/api/buffer.html

Ce que je cherche essentiellement à faire est de lire/supprimer le premier numéro de X d'octets, comme suit:

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 
} 

est ici ce que j'ai, mais il semble assez "mal" pour moi, même si cela semble aussi fonctionner:

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)); 

Y at-il une meilleure façon de le faire?

aussi, je ne sais pas si lire est le mot juste, mais la pop serait connoter un tableau ... quel est le mot juste à utiliser la décrire ce que cette fonction fait?

Répondre

9

De l'Node.js API:

Les instances de la classe tampon sont semblables à des tableaux d'entiers, mais correspondent à des allocations de mémoire-taille fixe, premières en dehors du tas de V8. La taille de la mémoire tampon est établie lors de sa création et ne peut pas être redimensionnée.

Quelle est la raison pour laquelle il n'y a pas de méthode .pop() pour Buffer parce qu'il est pas une opération pour quelque chose qui est de taille fixe dans la nature, contrairement à un tableau. Idem pour shift et splice. Vous ne pouvez pas étendre le Buffer déjà alloué mais vous pouvez en créer de nouveaux.

L'utilisation .slice() ne vous donnera pas une nouvelle Buffer, au contraire, renvoie un sous-ensemble de la mémoire occupée par le Buffer d'origine. Bien que cette approche fonctionne, il peut y avoir une possibilité qu'une autre variable référence toujours l'original Buffer auquel cas, les modifications apportées au sous-ensemble que vous avez obtenu de .slice() pourraient également être reportées sur l'original Buffer.

Étant donné la nature de Buffer et le type d'opérations que vous semblez vouloir, il est préférable de convertir d'abord items en une chaîne. Vous pouvez ensuite effectuer toutes les opérations que vous avez mentionnées en divisant en utilisant .split(''). Une fois que vous avez terminé, vous pouvez joindre la chaîne fractionnée et créer un nouveau Buffer en utilisant Buffer.from(string) et l'assigner à items. De cette façon, votre code sera beaucoup plus clair.

+0

réponse parfaite .. – Deep