php msgpack_pack以及如何在Unity3d中转换C#

时间:2014-11-07 05:58:56

标签: php json unity3d msgpack

我想知道为什么使用msgpack不会在php中加密。

我认为" {" id":1," v1":" bla"," v2":&# 34; FOO"}"将转换为十六进制字符串" 83 a2 69 64 01 a2 76 31 a3 62 6c 61 a2 76 32 a3 66 6f 6f"

但结果是"鱿" id":1," v1":" bla"," v2": "富"}" 为什么?

这是我的代码:

include_once "msgpack.php";
$phpVariable = array( "id"=>1, "v1"=>'bla',"v2"=> 'foo');
$json = json_encode($phpVariable,true);
echo $json."<br>";//{"id":1,"v1":"bla","v2":"foo"}
$binaryString = msgpack_pack($json);
echo $binaryString."<br>";//魷"id":1,"v1":"bla","v2":"foo"}
$base64 = base64_encode($binaryString);
echo $base64."<br>";//vnsiaWQiOjEsInYxIjoiYmxhIiwidjIiOiJmb28ifQ==

------------output-----------------------
{"id":1,"v1":"bla","v2":"foo"}
魷"id":1,"v1":"bla","v2":"foo"}
vnsiaWQiOjEsInYxIjoiYmxhIiwidjIiOiJmb28ifQ==

如果我只使用php msgpack,请不要使用json_encode, 但我不知道如何在Unity3d C#中转换decodeBytes。

//php code
$data = (object) array('name' => 'peter', 'age' => '30');//this could be a multi array
$msgpack_response = msgpack_pack($data);
$msgpack_response = base64_encode($msgpack_response);
echo $msgpack_response;

 //Unity3d C# use msgpack 
 byte[] decodedBytes = Convert.FromBase64String (text);
 ObjectPacker packer = new ObjectPacker ();
 ??? data = packer.Unpack<???>(decodedBytes);//I don't know the type and how to convert?

1 个答案:

答案 0 :(得分:0)

msg_pack是二进制序列化程序。所以msgpack_pack的结果必须是一个二进制字符串,它只是为了回应它而不知道是什么在一边。

无论如何。 $json变量是一个字符串。根据此type overview msgpack将为您的字符串fixstr 101xxxxx 0xa0 - 0xbf添加前缀。

字符串长度为30 1010 0000(2) + 0000 1110(2) = 1011 1110(2) = BE(16)。因此,结果的第一个字节为BE

然后,您尝试将二进制字符串作为多字节字符串进行回显。它将两个第一个字节捕获为一个符号。