web-dev-qa-db-ja.com

バッファを配列に変換

memcached

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

PHP、

Node.jsでmemcachedプラグインを使用すると、結果として配列ではなくバッファが表示されます

<Buffer 61 3a 25 61 34 3a>

そのようなバッファを配列に変換できません

Node.jsで:

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

何か方法はありますか?

19
Ata

_arr = [...buffer]_

ES6では、バッファ以外にも多くの機能が導入されました。

次のように簡単に追加することもできます。

arr.Push(...buffer)

_..._演算子は、配列で使用されると、配列やバッファーなどの列挙可能なものを展開します。また、それらを個別の関数引数に展開します。


はい、それはまたより速いです:

...:x100000:835.850ms

プロトタイプからのスライス呼び出し: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

どうぞ:

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

整数の配列に変換する別の方法があります

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 ]

ベンチマークの例

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

[〜#〜]出力[〜#〜]

...バッファ:559.932ms
array.prototype.slice.call:1176.535ms
toJSON()。data:30.571ms

または、Bufferでより専門的なカスタム関数が必要な場合は、これを使用してください:

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 [];
}

ベンチマークの例:

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

出力:

toArrayInteger:28.714ms

注:最後の例では、関数を Buffer.toJSON からコピーし、カスタムにライトしました

4
DarckBlezzer

Memcachedを使用していないので、このバッファーが何を表しているのか、代わりに何が必要なのかがわかりません。ごめんなさい。以下は、バッファをバイトの配列に分割する関数です。 node.js Buffer docs の詳細、役立つことを願っています!

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

私は解決策を持っていますが、現在より良いものを見つけようとしています:

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

編集:より簡単な方法を見つけました:

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

しかし、すでに誰かが言ったように、_[...buffer]_はより高速です(そしてよりコード効率が良い)。

new Uint8Array(buffer [, byteOffset [, length]]);を使用することもできます

0
JacobTDC