1 回答
TA贡献1840条经验 获得超5个赞
您的输入不是一个简单的压缩块,而是一个zlib 流。
根据ZLIB 压缩数据格式规范 3.3,前 2 个字节是:
-------------
| CMF | FLG |
-------------
压缩方法和标志。您的输入以十六进制的[120, 156]which开头78 9C。这是默认压缩。也没有字典跟随,所以后续数据是压缩数据。
位 0 到 3 是 CM 压缩方法,位 4 到 7 是 CINFO 压缩信息。在这种情况下,CINFO=7 表示 32K 窗口大小,CM=8 表示“deflate”压缩方法。FLG 位 5 表示是否预设了字典,在这种情况下是。FLG 的详细信息也在链接的RFC 1950 中。
所以你的输入基本上告诉其余的数据是使用默认压缩构造的,但是 goflate包不会解码它。
更改您的解压缩以省略前 2 个字节,它会起作用:
enflated, err := ioutil.ReadAll(flate.NewReader(bytes.NewReader(content[2:])))
在Go Playground上试一试。但...
使用正确的 ZLib 解压!
这次我们很幸运,因为压缩级别是默认的,并且字典是预设的。如果没有,您将无法使用该flate包对其进行解码。由于输入是 zlib 流,因此您应该使用该compress/zlib包对其进行正确解码,而不要依赖运气:
r, err := zlib.NewReader(bytes.NewReader(content))
if err != nil {
panic(err)
}
enflated, err := ioutil.ReadAll(r)
if err != nil {
panic(err)
}
fmt.Println(string(enflated))
zlib在Go Playground上试试这个变体。
- 1 回答
- 0 关注
- 576 浏览
添加回答
举报