2016-11-25 11 views
0

私は公式のMsgPackバージョン(http://msgpack.org/)を使用しています。これはサーバー側にPHP 7用にインストールされ、クライアント(任意のブラウザ)にライブラリ(msgpack.js)として含まれています。ブラウザでmsgpackで簡単ArrayBufferを詰めることができ:パックされた[129、164、110、97、109、101、196、5、118、97、108、117、:PHPとJavascriptの間の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))); 

、ここでは、コンソール出力であります101]

'value'のASCIIコードの前には、196(データの種類はArrayBuffer)と5(ArrayBufferデータの長さ)の2つの追加のmspackフラグがあります。ここではすべてが明確です。

質問は - どのように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パック()を試しましたが、これは役に立ちませんでした。

答えて

0

現在のmsgpack-php拡張機能(v2.0.2)では実際には不可能です。詳細については、以下のチケットを参照してください:

use MessagePack\Packer; 

$data = ['name' => 'value']; 
$packed = (new Packer(Packer::FORCE_BIN))->pack($data); 

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

出力:[129, 196, 4, 110, 97, 109, 101, 196, 5, 118, 97, 108, 117, 101]

、それは rybakit/msgpackライブラリを達成するためには非常に簡単です

が、

関連する問題