8月7日@黃同學(xué)找我問:“數(shù)據(jù)存到redis是gzdeflate壓縮過的數(shù)據(jù),golang從redis取出來(lái),解壓縮失敗”。很多從PHP轉(zhuǎn)Golang的業(yè)務(wù)經(jīng)常會(huì)遇到,所以寫下這篇博文,希望可以幫助更多人。
想要使用golang解碼php的編碼,那么就應(yīng)該需要知道gzdeflate函數(shù)的算法是什么,先到gzdeflate文檔,查看了一下發(fā)現(xiàn):gzdeflate使用的是純粹的DEFLATE格式
。這就與golang的compress/flate
包一致了。有了了解就可以看著golang文檔實(shí)現(xiàn)代碼了。遂與@黃同學(xué)同學(xué)寫了幾個(gè)函數(shù)進(jìn)行驗(yàn)證,最后定稿如下:
創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè)|網(wǎng)站建設(shè)維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋門簾等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身制作品質(zhì)網(wǎng)站。
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() }
經(jīng)過@黃同學(xué)同學(xué)測(cè)試可以正確使用。留下wiki供后續(xù)遇到的同學(xué)查看。