从消息包转换到消息包
Convert from and to messagepack
所以我试图在 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!"}
修改"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
最好的方法是先解码它,通过 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))
使用编解码器库并假设 {"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.
所以我试图在 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!"}
修改"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
最好的方法是先解码它,通过 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))
使用编解码器库并假设 {"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.