将缓冲区转换为数组

我正在设置memcached

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

任何工作在PHP中,

在使用memcached插件的nodejs中,我得到了一个缓冲区而不是数组

 <Buffer 61 3a 25 61 34 3a> 

我不能将这样的缓冲区转换为数组

在nodjs:

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

你有什么办法?

arr = [...buffer]

ES6引入了很多其他function,除了缓冲区。

你甚至可以很容易地追加这样的:

arr.push(...buffer)

在数组中使用...运算符扩展枚举types,如数组和缓冲区。 它也将它们扩展为单独的函数参数。


是的,它也更快:

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

干得好:

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

我还没有使用memcached,所以我不确定这个缓冲区代表什么或者你想要什么。 抱歉。 这是一个将缓冲区分成一个字节数组的函数。 更多在node.js缓冲文件 ,希望它有帮助!

 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' ] 

当然,没有关于这方面的信息,但我find了转换的方式

在nodejs中,我必须使用:

 var arrayobject = phpjs.unserialize(data.toString()); 

但是,获取数组是非常愚蠢的方式,似乎php设置memcache时serilzie数据。

我有一个解决scheme,虽然我目前正在试图find一个更好的:

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

编辑:我find了一个更简单的方法:

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

但是,就像已经说过的那样, [...buffer]速度更快(并且代码效率更高)。

你也可以使用new Uint8Array(buffer [, byteOffset [, length]]);