【问题标题】:Msgpack between PHP and JavascriptPHP 和 Javascript 之间的 Msgpack
【发布时间】:2023-03-09 04:23:02
【问题描述】:

我正在使用官方 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)));

这是控制台输出:packed [129, 164, 110, 97, 109, 101, 196, 5, 118, 97, 108, 117, 101]

我们在这里看到,在“值​​”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 代码中变量的类型是字符串,但是如何在 PHP 中模拟 ArrayBuffer(原始二进制)数据?

我尝试过 PHP pack() 但这没有帮助。

【问题讨论】:

    标签: javascript php encoding arraybuffer msgpack


    【解决方案1】:

    使用当前的 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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 2011-09-30
      • 1970-01-01
      相关资源
      最近更新 更多