gpt4 book ai didi

javascript - 尝试让 msgpack-cli 为我提供与 JavaScript 中相同的打包字节数组

转载 作者:行者123 更新时间:2023-12-03 03:05:00 25 4
gpt4 key购买 nike

在 JavaScript 中,我可以使用 msgpack按如下方式打包对象:

msgpack.pack(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]

如何使用msgpack-cli在 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 获得的打包数据不一样。我认为消息包应该是跨平台友好的。这里发生了什么以及如何创建一个 C# 等效对象以使解串器将其打包到与 JavaScript 中相同的字节数组中?

最佳答案

我明白了。诀窍是检查 JavaScript 中编码的第一个字节,您将看到 132 对应于十六进制 0x84。十六进制 0x84 根据 message pack specification是一个修复映射(0x800x8f)。使用此提示,我们可以尝试猜测 fixmap 必须对应于 C# 中的字典数据类型(因为映射或多或少类似于键值对的字典)。

我们只需要使用一个有效负载对象,它实际上是一个字符串对象对的字典,以及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-cli 为我提供与 JavaScript 中相同的打包字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47209244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com