1 回答

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個贊
您的輸入不是一個簡單的壓縮塊,而是一個zlib 流。
根據(jù)ZLIB 壓縮數(shù)據(jù)格式規(guī)范 3.3,前 2 個字節(jié)是:
-------------
| CMF | FLG |
-------------
壓縮方法和標(biāo)志。您的輸入以十六進(jìn)制的[120, 156]which開頭78 9C。這是默認(rèn)壓縮。也沒有字典跟隨,所以后續(xù)數(shù)據(jù)是壓縮數(shù)據(jù)。
位 0 到 3 是 CM 壓縮方法,位 4 到 7 是 CINFO 壓縮信息。在這種情況下,CINFO=7 表示 32K 窗口大小,CM=8 表示“deflate”壓縮方法。FLG 位 5 表示是否預(yù)設(shè)了字典,在這種情況下是。FLG 的詳細(xì)信息也在鏈接的RFC 1950 中。
所以你的輸入基本上告訴其余的數(shù)據(jù)是使用默認(rèn)壓縮構(gòu)造的,但是 goflate包不會解碼它。
更改您的解壓縮以省略前 2 個字節(jié),它會起作用:
enflated, err := ioutil.ReadAll(flate.NewReader(bytes.NewReader(content[2:])))
在Go Playground上試一試。但...
使用正確的 ZLib 解壓!
這次我們很幸運(yùn),因?yàn)閴嚎s級別是默認(rèn)的,并且字典是預(yù)設(shè)的。如果沒有,您將無法使用該flate包對其進(jìn)行解碼。由于輸入是 zlib 流,因此您應(yīng)該使用該compress/zlib包對其進(jìn)行正確解碼,而不要依賴運(yùn)氣:
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 關(guān)注
- 672 瀏覽
添加回答
舉報