您好,登錄后才能下訂單哦!
8月7日@黃同學找我問:“數據存到redis是gzdeflate壓縮過的數據,golang從redis取出來,解壓縮失敗”。很多從PHP轉Golang的業務經常會遇到,所以寫下這篇博文,希望可以幫助更多人。
想要使用golang解碼php的編碼,那么就應該需要知道gzdeflate函數的算法是什么,先到gzdeflate文檔,查看了一下發現:gzdeflate使用的是純粹的DEFLATE格式
。這就與golang的compress/flate
包一致了。有了了解就可以看著golang文檔實現代碼了。遂與@黃同學同學寫了幾個函數進行驗證,最后定稿如下:
package main import ( "strings" "fmt" "compress/flate" "bytes" "io/ioutil" ) func main() { str:="huangyupeng123" b:=Gzdeflate(str,-1) ss:=Gzencode(string(b)) fmt.Println(ss) /*str:="huangyupeng123" ss:=Gzdeflate(str,0) fmt.Println(ss) s=Gzencode(ss) fmt.Println(s)*/ } // 解碼 func Gzencode(data string) string { r :=flate.NewReader(strings.NewReader(data)) defer r.Close() out, err := ioutil.ReadAll(r) if err !=nil { fmt.Errorf("%s\n",err) } return string(out) } // 編碼 func Gzdeflate(data string,level int) []byte { var bufs bytes.Buffer w,_ :=flate.NewWriter(&bufs,level) w.Write([]byte(data)) w.Flush() w.Close() return bufs.Bytes() } // 編碼 func GzdeflateForString(data string,level int) string { var bufs bytes.Buffer w,_ :=flate.NewWriter(&bufs,level) w.Write([]byte(data)) w.Flush() defer w.Close() return bufs.String() }
經過@黃同學同學測試可以正確使用。留下wiki供后續遇到的同學查看。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。