Msgpack между PHP и Javascript

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

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 двоичные) данные в PHP?

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

0

Решение

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

Хотя с помощью rybakit / msgpack библиотека (см. примеры / binary.php):

use MessagePack\Packer;
use MessagePack\PackOptions;
use MessagePack\Type\Binary;
use MessagePack\TypeTransformer\BinaryTransformer;

$packer = new Packer(PackOptions::FORCE_STR);
$packer->registerTransformer(new BinaryTransformer());

$packed = $packer->pack(['name' => new Binary('value')]);

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

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

0

Другие решения

Других решений пока нет …