登录
首页 >  Golang >  Go问答

解析 msgpack 编码的单个切片的 msgpack 编码切片时为空切片

来源:stackoverflow

时间:2024-03-17 09:48:29 495浏览 收藏

解析 msgpack 编码的单个切片的 msgpack 编码切片时,会出现空切片的问题。这是因为使用了 []interface{} 作为解包类型。正确的做法是使用 [][]byte,将 root msg 解组为 [][]byte,然后迭代字节切片并解组每个子字节切片。

问题内容

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

为了说明这一点,我的回答如下所示:

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

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

msgpack:无效的code=3f解码数组长度,因此我得到的只是空切片。

这个 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,然后迭代字节切片并解组每个子字节切片。您不需要 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
}

终于介绍完啦!小伙伴们,这篇关于《解析 msgpack 编码的单个切片的 msgpack 编码切片时为空切片》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>