go - 解析 msgpack 编码单个 slice 的 msgpack 编码 slice 时为空 slice

标签 go gzip msgpack

我正在尝试解码来自服务器的 gzip 响应,该响应是一个 msgpack 数组或最终被 gzip 压缩的 msgpack 数组。

为了说明这一点,我的回复看起来像这样:

gzip(msgpack([msgpack([]), msgpack([]), msgpack([]) ....]))

这是我到目前为止所做的,但是我收到了 msgpack 错误

msgpack: invalid code=3f decoding array length 因此我得到的只是空 slice 。

我从这个 SO answer 中获取的这个 getBytes 函数

func getBytes(key interface{}) ([]byte, error) {
    var buf bytes.Buffer
    enc := gob.NewEncoder(&buf)
    err := enc.Encode(key)
    if err != nil {
        return nil, err
    }
    return buf.Bytes(), nil
}

var unZipped io.Reader
unZipped, err = gzip.NewReader(resp.Body)
var dataBytes bytes.Buffer
_, err = dataBytes.ReadFrom(unZipped)
if err != nil {
    logger.Println("error un gzipping", err)
}
var packedSlices []interface{}
bytesSlice := dataBytes.Bytes()
err = msgpack.Unmarshal(bytesSlice, &packedSlices)
for _, c := range packedSlices {
    var packedSlice []interface{}
    byts, _ := getBytes(c)
    err = msgpack.Unmarshal(byts, &packedSlice)
    logger.Println(err, packedSlice)
}

当我在 python 3.7 中做同样的事情时,它工作正常:

resp = requests.post(url, headers=headers, json=payload, stream=True)
datas = msgpack.loads(gzip.decompress(resp.raw.data))
datas = [msgpack.loads(k) for k in datas]

我在这里遗漏了什么吗??

最佳答案

不要使用 []interface{} 类型作为解压类型,而是使用 [][]byte。将 root msg 解码为 [][]byte 然后遍历字节 slice 的 slice 并解码每个子字节 slice 。您不需要 getBytes 函数。

这里有一些例子:

var root [][]byte
if err :=  msgpack.Unmarshal(bytesSlice, &root); err != nil {
    panic(err)
}

for _, childBytes := range root {
    var child []interface{}
    if err := msgpack.Unmarshal(childBytes, &child); err != nil {
        panic(err)
    }

    _ = child
}

关于go - 解析 msgpack 编码单个 slice 的 msgpack 编码 slice 时为空 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55417095/

相关文章:

asp.net-mvc - 在 IIS 10 中通过 HTTP/2 推送服务器时如何 GZIP 压缩 CSS 文件

git - 压缩包含 `.git` 目录的 git 存储库目录

php - 对 mysqldump 使用 gzip 压缩

c - 如何解压 msgpack 文件?

redis - 如何在redis-cli中查看解码后的消息包数据

带有 float 的 Java msgpack 类崩溃

regex - 在 Go 中使用正则表达式拆分字符串

go - 结合 net/http 和 fasthttp

go - 将一片字符串转换为一片 float32

go - 你怎么称呼:= operator?