web-dev-qa-db-fra.com

Convertir le tampon en tableau

Je mets memcached avec

$memcached->set("item" , ["1" => "hello"]);

tout fonctionne en PHP,

Dans Node.js avec le plugin memcached, j'obtiens un tampon au lieu d'un tableau dans le résultat

<Buffer 61 3a 25 61 34 3a>

Je ne peux pas convertir un tel tampon en tableau

Dans Node.js:

memcached.get("item" , function(err, data) {
  console.log(data);
}

Avez-vous un moyen?

19
Ata

arr = [...buffer]

ES6 a introduit de nombreuses autres fonctionnalités, en plus des tampons.

Vous pouvez même facilement ajouter comme ceci:

arr.Push(...buffer)

L'opérateur ... Développe les énumérables tels que les tableaux et les tampons lorsqu'il est utilisé dans le tableau. Il les développe également en arguments de fonction distincts.


Oui, c'est aussi plus rapide:

...: x100000: 835.850ms

Slice call from prototype: x100000: 2118.513ms

var array,
    buffer = new Buffer([1, 4, 4, 5, 6, 7, 5, 3, 5, 67, 7, 4, 3, 5, 76, 234, 24, 235, 24, 4, 234, 234, 234, 325, 32, 6246, 8, 89, 689, 7687, 56, 54, 643, 32, 213, 2134, 235, 346, 45756, 857, 987, 0790, 89, 57, 5, 32, 423, 54, 6, 765, 65, 745, 4, 34, 543, 43, 3, 3, 3, 34, 3, 63, 63, 35, 7, 537, 35, 75, 754, 7, 23, 234, 43, 6, 247, 35, 54, 745, 767, 5, 3, 2, 2, 6, 7, 32, 3, 56, 346, 4, 32, 32, 3, 4, 45, 5, 34, 45, 43, 43]),
    iter = 100000;

array = buffer;

console.time("... : x" + iter);
for (var i = iter; i--;) array = [...buffer]
console.timeEnd("... : x" + iter);

console.time("Apply/call/etc : x" + iter);
for (var i = iter; i--;) array = Array.prototype.slice.call(buffer, 0)
console.timeEnd("Apply/call/etc : x" + iter);
37
user4584267

Voici:

var buffer = new Buffer([1,2,3])
var arr = Array.prototype.slice.call(buffer, 0)
console.log(arr)
8
Chipintoza

Il existe une autre façon de convertir en tableau d'entiers

Utilisation de toJSON ()

Buffer.from('Text of example').toJSON()
{ type: 'Buffer',data: [ 84, 101, 120, 116, 32, 111, 102, 32, 101, 120, 97, 109, 112, 108, 101 ] }

// simple get data
Buffer.from('Text of example').toJSON().data
[ 84, 101, 120, 116, 32, 111, 102, 32, 101, 120, 97, 109, 112, 108, 101 ]

Exemple de référence

// I took this from @user4584267's answer
const buffer = new Buffer([1, 4, 4, 5, 6, 7, 5, 3, 5, 67, 7, 4, 3, 5, 76, 234, 24, 235, 24, 4, 234, 234, 234, 325, 32, 6246, 8, 89, 689, 7687, 56, 54, 643, 32, 213, 2134, 235, 346, 45756, 857, 987, 0790, 89, 57, 5, 32, 423, 54, 6, 765, 65, 745, 4, 34, 543, 43, 3, 3, 3, 34, 3, 63, 63, 35, 7, 537, 35, 75, 754, 7, 23, 234, 43, 6, 247, 35, 54, 745, 767, 5, 3, 2, 2, 6, 7, 32, 3, 56, 346, 4, 32, 32, 3, 4, 45, 5, 34, 45, 43, 43]);
let array = null;
const iterations = 100000;

console.time("...buffer");
for (let i = iterations; i=i-1;) array = [...buffer]
console.timeEnd("...buffer");

console.time("array.prototype.slice.call");
for (let i = iterations; i=i-1;) array = Array.prototype.slice.call(buffer, 0)
console.timeEnd("array.prototype.slice.call");

console.time("toJSON().data");
for (let i = iterations; i=i-1;) array = buffer.toJSON().data
console.timeEnd("toJSON().data");

[~ # ~] sortie [~ # ~]

... tampon: 559.932ms
array.prototype.slice.call: 1176,535 ms
toJSON (). data: 30,571 ms

ou si vous voulez plus de fonctions professionnelles et personnalisées dans Buffer utilisez ceci:

Buffer.prototype.toArrayInteger = function(){
    if (this.length > 0) {
        const data = new Array(this.length);
        for (let i = 0; i < this.length; i=i+1)
            data[i] = this[i];
        return data;
    }
    return [];
}

Exemple de référence:

const buffer = new Buffer([1, 4, 4, 5, 6, 7, 5, 3, 5, 67, 7, 4, 3, 5, 76, 234, 24, 235, 24, 4, 234, 234, 234, 325, 32, 6246, 8, 89, 689, 7687, 56, 54, 643, 32, 213, 2134, 235, 346, 45756, 857, 987, 0790, 89, 57, 5, 32, 423, 54, 6, 765, 65, 745, 4, 34, 543, 43, 3, 3, 3, 34, 3, 63, 63, 35, 7, 537, 35, 75, 754, 7, 23, 234, 43, 6, 247, 35, 54, 745, 767, 5, 3, 2, 2, 6, 7, 32, 3, 56, 346, 4, 32, 32, 3, 4, 45, 5, 34, 45, 43, 43]);
let array = null;
const iterations = 100000;

console.time("toArrayInteger");
for (let i = iterations; i=i-1;) buffer.toArrayInteger();
console.timeEnd("toArrayInteger");

Sortie:

toArrayInteger: 28,714 ms

Remarque: Dans le dernier exemple, j'ai copié une fonction de Buffer.toJSON et l'ai personnalisée un peu

4
DarckBlezzer

Je n'ai pas utilisé memcached, donc je ne sais pas exactement ce que ce tampon représente ou ce que vous voulez avoir à la place. Désolé. Voici une fonction pour diviser un tampon en un tableau d'octets. Plus sur node.js Buffer docs , j'espère que ça aide!

var hex = new Buffer("613a2561343a", "hex");
var l = hex.length; // in bytes
var output = [];
for(var i = 0; i < l; i++){
  var char = hex.toString('hex',i,i+1); // i is byte index of hex
  output.Push(char);
};
console.log(output);
// output: [ '61', '3a', '25', '61', '34', '3a' ]
2
Plato

J'ai une solution, bien que j'essaie actuellement d'en trouver une meilleure:

function bufToArray(buffer) {
  let array = new Array();
  for (data of buffer.values()) array.Push(data);
  return array;
}

EDIT: J'ai trouvé un moyen plus simple:

var buffer = Buffer.from('NodeJS rocks!')
var array = new Function(`return [${Array.prototype.slice.call(buffer, 0)}]`)

Mais, comme quelqu'un l'a déjà dit, [...buffer] Est plus rapide (et plus efficace en code).

Vous pouvez également utiliser new Uint8Array(buffer [, byteOffset [, length]]);

0
JacobTDC