go - 消息包之间的转换

标签 go msgpack

所以我试图在 Golang 中获取 JSON 消息的字符串表示形式。我只想接收消息包编码的 JSON,修改一些值并将其发送回来。

我还没有找到简单的方法来做到这一点。大多数时候,我无法提前知道 JSON 的结构是什么(除了具有 JSON 结构),所以我想做的就是接收二进制消息。解码为JSON,作为字符串打印到标准输出,修改内容,再次转换为MessagePack并发回。

我一直在研究这两个包,但我不知道如何正确使用它们来完成这样的简单任务:

所以我会收到这样的东西:

DF 00 00 00 01 A7 6D 65 73 73 61 67 65 A3 48 69 21

我想打印这个:

{"message": "Hi!"}

修改“嗨!”:

{"message": "Hello Sir!"}

将其作为消息包发送:

DF 00 00 00 01 A7 6D 65 73 73 61 67 65 AA 48 65 6C 6C 6F 20 53 69 72 21

我正在尝试移植到 Golang 的当前 Python 代码:

def decode_msgpack(jsonData):
    packedStuff = 0
    for key in jsonData.keys():
        if type(jsonData[key]) is bytes:
            packedStuff += 1
            try:
                jsonData[key] = umsgpack.unpackb(jsonData[key])
            except umsgpack.InvalidStringException:
                try:
                    jsonData[key] = umsgpack.unpackb(jsonData[key], allow_invalid_utf8=True)
                except umsgpack.InsufficientDataException:
                    print("[!] InsufficientDataException")
                    jsonData[key] = base64.b64encode(jsonData[key]).decode('utf-8')
                else:
                    jsonData[key] = base64.b64encode(jsonData[key]).decode('utf-8')

    if packedStuff > 0:
        return decode_msgpack(jsonData)
    else:
        return jsonData

最佳答案

使用编解码器库并假设 {"message": "Hi"} 是一个 map ,代码将如下所示。

package main

import (
        "fmt"

        "github.com/ugorji/go/codec"
)

func main() {
        var data []byte
        original := map[string]string{"message": "Hi!"}
        enc := codec.NewEncoderBytes(&data, new(codec.MsgpackHandle))
        if err := enc.Encode(&original); err != nil {
                panic(err)
        }
        fmt.Printf("Encoded: ")
        for _, b := range data {
                fmt.Printf("%X ", b)
        }
        fmt.Printf("\n")
        decoded := make(map[string]string)
        dec := codec.NewDecoderBytes(data, new(codec.MsgpackHandle))
        if err := dec.Decode(&decoded); err != nil {
                panic(err)
        }
        fmt.Printf("Decoded: %v\n", decoded)
        decoded["message"] = "Hello Sir!"
        /* reinitialize the encoder */
        enc = codec.NewEncoderBytes(&data, new(codec.MsgpackHandle))
        if err := enc.Encode(&decoded); err != nil {
                panic(err)
        }
        fmt.Printf("Encoded: ")
        for _, b := range data {
                fmt.Printf("%X ", b)
        }
        fmt.Printf("\n")
}

也就是说,如果您得到 {"message": "Hi"} 作为 JSON 字符串,您可以使用编解码器将 JSON 解码为映射,更新映射,然后重新编码它作为 msgpack。

关于go - 消息包之间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53546967/

相关文章:

go - 作为 goroutines 启动的 3 个不同的函数产生相同的 goroutine(显然忽略参数)

使用 MSGPack Core 和 Jackson Mapper 的 Android - 解码未知类型的类变量

asp.net-core - 避免 DateTime 转换,同时将其传递给 AspNetCore.SignalR .Net 客户端

java - 从java中的Http请求中检索Msgpack

python - 将 Msgpack 与 Flask 和 AngularJS 一起使用时出现无效类型错误

image - 在 Golang 中比较 base64 图像字符串

python - 在 Go 中枚举常量的最佳方法

go - WebSocket - 关闭握手 gorilla

templates - golang 模板中的调用链

Java - 将 MessagePack 时间戳转换为日期