Я использую официальную версию 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-пакет(), но это не помогло.