从和转换成消息包

时间:2018-11-29 20:21:52

标签: go msgpack

因此,我试图在Golang中获取JSON消息的字符串表示形式。我只想接收messagepack编码的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

2 个答案:

答案 0 :(得分:1)

最好的方法是先对其进行解码,然后通过Go结构进行更改,然后对其进行重新编码。

data := []byte(`{"message": "Hi!"}`)
var p map[string]interface{}

// Decode into Struct
if err := json.Unmarshal(data, &p); err != nil {
    // TODO: handle err
}

// Modify contents
p["message"] = "Hello Sir!"

// Encode from struct
newData, err := json.Marshal(p)
if err != nil {
    // TODO: Handle err
}

fmt.Println(string(newData))

答案 1 :(得分:1)

使用编解码器库并假设{"message": "Hi"}是映射,代码看起来像这样。

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。