【发布时间】: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