2017-11-09 5 views
0

に行うように私に同じパックバイト配列を与えることmsgpack-cliを取得しようとすると、私は、オブジェクトをパックするmsgpackを使用することができます。それはJavaScriptではJavaScriptの

ペイロードは、以下のオブジェクトである
msgpack.pack(payload); 

:私は、このオブジェクトにmsgpack.pack(payload);を呼び出すと

var payload = { event: "phx_join", payload: {}, ref: "1", topic: "players:1" }; 

、私は戻って(Uint8Arrayなど)は、次のバイトを取得:

[132, 165, 116, 111, 112, 105, 99, 169, 112, 108, 97, 121, 101, 114, 115, 58, 49, 165, 101, 118, 101, 110, 116, 168, 112, 104, 120, 95, 106, 111, 105, 110, 167, 112, 97, 121, 108, 111, 97, 100, 128, 163, 114, 101, 102, 161, 49] 

をC#で使うと、C#のオブジェクトを上記と同じバイトシーケンスに変換できますか? C#で使用しているオブジェクト形式はそれほど重要ではありませんが、重要なのはバイトシーケンスが同じであることです。ここで私が試したものです:

public class Payload 
{ 
    public string @event; 
    public MessagePackObject payload; 
    public string @ref; 
    public string topic; 
} 

var payload = new Payload 
{ 
    @event = "phx_join", 
    payload = new MessagePackObject(), 
    @ref = "1", 
    topic = "players:1" 
}; 
var packedBytes = SerializationContext.Default.GetSerializer<Payload>().PackSingleObject(payload); 

次のように残念ながら、私は戻って、この場合の取得パックのバイトは、次のとおりです。

[148, 168, 112, 104, 120, 95, 106, 111, 105, 110, 192, 161, 49, 169, 112, 108, 97, 121, 101, 114, 115, 58, 49] 

それは私は、JavaScriptから取得するパックされたデータと同じではありません。私は、メッセージパックがクロスプラットフォームであると考えられていたと思った。ここで何が起こっているのですが、デシリアライザでJavaScriptと同じバイト配列にパックするために、C#の同等のオブジェクトを作成するにはどうすればよいですか?

答えて

1

私はそれを理解しました。 JavaScriptでエンコードされた最初のバイトを確認することですが、132はHEX 0x84に対応しています。 message pack specificationに従うHEX 0x84は、fixmap0x80~0x8f)である。このヒントを使用して、fixmapがC#の辞書データ型に対応している必要があることを推測できます(地図は多かれ少なかれキーと値のペアの辞書なので)。

は我々だけで、実際にstringobjectペアの辞書であるペイロード・オブジェクトを使用する必要がある、とmsgpack-cliが正常のC#から同じバイトシーケンスにそれをパックします:

var payload = new Dictionary<string, object>() { 
    { "event", "phx_join" }, 
    { "payload", new Dictionary<string, object>() }, 
    { "ref", "1" }, 
    { "topic", "players:1" } 
}; 
var packedBytes = SerializationContext.Default.GetSerializer<Dictionary<string, object>>().PackSingleObject(payload); 
関連する問題