PHP和Javascript之间的Msgpack

时间:2016-11-25 16:14:47

标签: javascript php encoding arraybuffer msgpack

我使用官方的MsgPack版本(http://msgpack.org/),在服务器端安装了PHP 7,并作为库(msgpack.js)包含在客户端(任何浏览器)上。让我们在浏览器中使用msgpack打包简单的ArrayBuffer:

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]

我们在这里看到的是&#39;值&#39; 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]) . ",";

输出结果为:&#34; 129,164,110,97,109,101,165,118,97,108,117,101,&#34;

显然[196,5]改为[165]。我明白在PHP代码中变量的类型是字符串,但是如何在PHP中模拟ArrayBuffer(原始二进制)数据?

我尝试过PHP pack(),但这没什么用。

1 个答案:

答案 0 :(得分:0)

使用当前的msgpack-php扩展(v2.0.2)并不是真的可行。有关详细信息,请参阅以下门票:

虽然使用rybakit/msgpack库很容易实现(请参阅examples/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]