首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析msgpack编码的单个切片的msgpack编码切片时为空切片

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

Stack Overflow用户
提问于 2019-03-29 20:05:32
回答 1查看 503关注 0票数 0

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

因此,为了说明这一点,我的响应如下所示:

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

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

msgpack: invalid code=3f decoding array length,因此我得到的都是空片。

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

代码语言:javascript
复制
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中做同样的事情时,它工作得很好:

代码语言:javascript
复制
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]

我是不是漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-30 01:35:55

使用[][]byte,而不是使用[]interface{}类型作为未打包类型。将根msg解组为[][]byte,然后迭代字节切片的切片,并解组每个子字节切片。你不需要getBytes函数。

下面是一些例子:

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55417095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档