2013-08-09 4 views
8

Я устанавливаю Memcached сПреобразовать буфер в массив

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

ничего работы в PHP,

В nodejs с Memcached плагин, я получаю буфер вместо массива в результате

<Buffer 61 3a 25 61 34 3a> 

Я не могу преобразовать такой буфер в массив

in nodjs:

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

У вас есть способ?

+0

У вас есть пример кода? – SheetJS

+0

@nirik: отредактировано, посмотрите – Ata

+0

Что произойдет, если вы просто назовете '$ memcached-> set (" item "," hello ");' in php? – SheetJS

ответ

-1

В интерент, не было никакой информации о том, что, но я нашел новообращенного путь

В nodejs, я должен использовать:

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

, но это очень глупый способ для получения массива , кажется, что php serilzie данные при установке memcache.

+0

Вы можете попытаться сохранить массив как JSON. '$ memcached-> set (" item ", json_encode ([" 1 "=>" hello "]));'. Затем декодируйте JSON в node.js. –

+0

Да, это так, но думаю, что мы получаем высокую скорость кодирования в секунду, таким образом, что это не эффективный способ – Ata

1

Я не использовал 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' ] 
+1

он просто разбил данные буфера, он не конвертирует каждый элемент в используемый символ – Ata

+0

Gotcha. Может быть, есть способ заставить PHP сохранить незашифрованную строку в memcached? Я не очень хорошо знаю, сэр - удачи! – Plato

5

Здесь вы идете:

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

Не могли бы вы добавить немного больше подробностей к вашему ответу? Благодаря! – maxshuty

13

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

У меня есть решение, хотя я в настоящее время пытается найти лучший один:

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

EDIT: я нашел более простой способ:

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

Но, как кто-то уже сказал, [...buffer] быстрее (и более эффективный код).

Вы также можете использовать new Uint8Array(buffer [, byteOffset [, length]]);

Смежные вопросы