第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang:“壓縮/扁平化”模塊無法解壓縮有效的 deflate 壓縮 HTTP 正文

Golang:“壓縮/扁平化”模塊無法解壓縮有效的 deflate 壓縮 HTTP 正文

Go
梵蒂岡之花 2021-09-27 17:45:02
這個問題延續(xù)了這里開始的討論。我發(fā)現(xiàn) HTTP 響應(yīng)正文由于deflate后者的壓縮而無法解組為 JSON 對象?,F(xiàn)在我想知道如何使用 Golang 進(jìn)行解壓。我將感謝任何可以在我的代碼中顯示錯誤的人。輸入數(shù)據(jù)我已將 HTTP 響應(yīng)正文轉(zhuǎn)儲到“測試”文件中。就這個:$ cat testx??PAN?0?;??NtJ?F?dU?|"oVR?C%?f?????Z.?^Hs?dW??'??DH?S?SFVC????r)G,?????<???z}?x_g?+?2??sl?r/?Oy>??J3\?G?9???N???#[5M?^v/?2???|?h??[?~7?_崛<D*???/??i讓我們確保這個文件可以解壓縮,甚至包含有效的 JSON:$ zlib-flate -uncompress < test{"timestamp":{"tv_sec":1428488670,"tv_usec":197041},"string_timestamp":"2015-04-08 10:24:30.197041","monitor_status":"enabled","commands":{"REVERSE_LOOKUP":{"cache":{"outside":{"successes":0,"failures":0,"size":0,"time":0},"internal":{"successes":0,"failures":0,"size":0,"time":0}},"disk":{"outside":{"successes":0,"failures":0,"size":0,"time":0},"internal":{"successes":13366,"failures":0,"size":0,"time":501808}},"total":{"storage":{"successes":0,"failures":0},"proxy":{"successes":13366,"failures":0}}},"clients":{}}}$ zlib-flate -uncompress < test | python -m json.tool{    "commands": {        "REVERSE_LOOKUP": {            "cache": {               ....源代碼package mainimport (    "bytes"    "compress/flate"    "fmt"    "io/ioutil")func main() {    fname := "./test"    content, err := ioutil.ReadFile(fname)    if err != nil {        panic(err)    }    fmt.Println("File content:\n", content)    enflated, err := ioutil.ReadAll(flate.NewReader(bytes.NewReader(content)))    if err != nil {        panic(err)    }    fmt.Println("Enflated:\n", enflated)}錯誤$ go run uncompress.go panic: flate: corrupt input before offset 5goroutine 1 [running]:runtime.panic(0x4a7180, 0x5)    /usr/lib/go/src/pkg/runtime/panic.c:266 +0xb6main.main()    /home/isaev/side-projects/elliptics-manager/uncompress.go:20 +0x2a3exit status 2PS Ubuntu 14.10,轉(zhuǎn)到 1.2.1
查看完整描述

1 回答

?
慕斯709654

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上試試這個變體。


查看完整回答
反對 回復(fù) 2021-09-27
  • 1 回答
  • 0 關(guān)注
  • 672 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號