2016-11-25 57 views
0

我使用官方MsgPack版本(http://msgpack.org/),在服務器端爲PHP 7安裝,並且在客戶端(任何瀏覽器)上包含爲庫(msgpack.js)。讓在瀏覽器包簡單ArrayBuffer與msgpack: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))); 

和這裏是控制檯輸出:包裝[129,164,110,97,109,101,196,5,118,97,108,117, 101]

我們在這裏看到,在'value'ascii代碼之前,我們有兩個額外的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包(),但這沒有幫助。

回答

0

目前的msgpack-php擴展(v2.0.2)並不可行。請參閱以下的門票信息:

雖然,這是很容易實現與rybakit/msgpack庫:

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]