解析 msgpack 编码单个切片的 msgpack 编码切片时为空切片
empty slice when parsing msgpack encoded slice of msgpack encoded individual slice
我正在尝试解码来自服务器的 gzip 响应,该响应是一个 msgpack 数组或最终被压缩的 msgpack 数组。
所以为了说明这一点,我的回复如下所示:
gzip(msgpack([msgpack([]), msgpack([]), msgpack([]) ....]))
这是我目前所做的,但我收到 msgpack 错误
msgpack: invalid code=3f decoding array length
因此我得到的只是空切片。
我从这个 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
然后遍历字节切片的切片并解组每个子字节切片。您不需要 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
}
我正在尝试解码来自服务器的 gzip 响应,该响应是一个 msgpack 数组或最终被压缩的 msgpack 数组。
所以为了说明这一点,我的回复如下所示:
gzip(msgpack([msgpack([]), msgpack([]), msgpack([]) ....]))
这是我目前所做的,但我收到 msgpack 错误
msgpack: invalid code=3f decoding array length
因此我得到的只是空切片。
我从这个 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
然后遍历字节切片的切片并解组每个子字节切片。您不需要 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
}