我正在使用
设置memcached
$memcached->set("item" , ["1" => "hello"]);
任何可以用PHP工作的东西,
在带有memcached
插件的Node.js中,我得到一个缓冲区而不是结果中的数组
<Buffer 61 3a 25 61 34 3a>
我无法将此类缓冲区转换为数组
在Node.js中:
memcached.get("item" , function(err, data) {
console.log(data);
}
你有什么办法吗?
答案 0 :(得分:33)
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);
答案 1 :(得分:7)
你走了:
var buffer = new Buffer([1,2,3])
var arr = Array.prototype.slice.call(buffer, 0)
console.log(arr)
答案 2 :(得分:2)
我没有使用过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' ]
答案 3 :(得分:1)
您也可以使用Array.from
:
memcached.get("item" , function(err, data) {
console.log(Array.from(data));
}
答案 4 :(得分:0)
我有一个解决方案,虽然我目前正在努力找到一个更好的解决方案:
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]]);
答案 5 :(得分:-2)
在internt中,没有相关信息,但我找到了转换方式
在nodejs中,我必须使用:
var arrayobject = phpjs.unserialize(data.toString());
但是,这对于获取数组来说是非常愚蠢的方式,看起来php在设置memcache时会对数据进行serilzie。