试图让 msgpack-cli 给我与 JavaScript 中相同的打包字节数组
Trying to get msgpack-cli to give me the same packed byte array as it does in JavaScript
在JavaScript中,我可以使用msgpack来打包一个对象如下:
msgpack.pack(payload);
其中 payload 是以下对象:
var payload = { event: "phx_join", payload: {}, ref: "1", topic: "players:1" };
当我对该对象调用 msgpack.pack(payload);
时,我得到以下字节(作为 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# 中使用 msgpack-cli 将对象从 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得到的打包数据不一样。我认为消息包应该是跨平台友好的。这里发生了什么,我如何创建一个 C# 等效对象以使反序列化器将其打包到与 JavaScript?
中相同的字节数组中
我明白了。诀窍是检查 JavaScript 中编码的第一个字节,您会看到 132
对应于 HEX 0x84
。 HEX 0x84
根据message pack specification是一个fixmap
(0x80
到0x8f
)。使用此提示,我们可以尝试猜测 fixmap
必须对应于 C# 中的字典数据类型(因为映射或多或少类似于键值对的字典)。
我们只需要使用一个负载对象,它实际上是 string
和 object
对的字典,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);
在JavaScript中,我可以使用msgpack来打包一个对象如下:
msgpack.pack(payload);
其中 payload 是以下对象:
var payload = { event: "phx_join", payload: {}, ref: "1", topic: "players:1" };
当我对该对象调用 msgpack.pack(payload);
时,我得到以下字节(作为 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# 中使用 msgpack-cli 将对象从 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得到的打包数据不一样。我认为消息包应该是跨平台友好的。这里发生了什么,我如何创建一个 C# 等效对象以使反序列化器将其打包到与 JavaScript?
中相同的字节数组中我明白了。诀窍是检查 JavaScript 中编码的第一个字节,您会看到 132
对应于 HEX 0x84
。 HEX 0x84
根据message pack specification是一个fixmap
(0x80
到0x8f
)。使用此提示,我们可以尝试猜测 fixmap
必须对应于 C# 中的字典数据类型(因为映射或多或少类似于键值对的字典)。
我们只需要使用一个负载对象,它实际上是 string
和 object
对的字典,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);