2016-11-25 7 views
0

Я использую официальную версию MsgPack (http://msgpack.org/), установленную для PHP 7 на стороне сервера и включенную в качестве библиотеки (msgpack.js) на клиенте (любой браузер). Позволяет упаковать простой ArrayBuffer с msgpack в браузере:Msgpack между PHP и Javascript

function s2b (s) { 
    var b = new Uint8Array(s.length); 
    for (var i = 0; i < s.length; i++) { 
    var c = s.charCodeAt(i); 
    if (c > 255) throw new Error("Wide characters are not allowed"); 
    b[i] = c; 
    } 
    return b; 
} 

var test = { 'name': s2b('value').buffer }; 
console.log('packed', new Uint8Array(msgpack.pack(test))); 

и вот вывод на консоль: упаковано [129, 164, 110, 97, 109, 101, 196, 5, 118, 97, 108, 117, 101]

Мы видим здесь, что перед кодами 'value' ascii мы имеем еще 2 дополнительных флага mspack - 196 (тип данных ArrayBuffer) и 5 ​​(длина данных ArrayBuffer). Здесь все ясно.

Вопрос в том, как построить тот же объект в PHP? Давайте посмотрим на мой код:

$data = [ 
    "name" => 'value', 
]; 
$packed = msgpack_pack($data); 
for($i = 0; $i < strlen($packed); $i++) echo ord($packed[$i]) . ","; 

Выход: "129,164,110,97,109,101,165,118,97,108,117,101,"

Очевидно [196, 5] заменяются на [165]. Я понял, что в PHP-коде тип переменной является строкой, но КАК ЭМУЛИРОВАТЬ данные ArrayBuffer (raw binary) в PHP?

Я пробовал PHP-пакет(), но это не помогло.

ответ

0

Это не реально с текущим расширением msgpack-php (v2.0.2). Смотрите следующие билеты детали:

Хотя, это довольно легко достичь с помощью rybakit/msgpack библиотеки:

use MessagePack\Packer; 

$data = ['name' => 'value']; 
$packed = (new Packer(Packer::FORCE_BIN))->pack($data); 

echo '[', implode(', ', unpack('C*', $packed)), "]\n"; 

Выход: [129, 196, 4, 110, 97, 109, 101, 196, 5, 118, 97, 108, 117, 101]

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

  • Нет связанных вопросов^_^