Golang 的zlib 和Python 的zlib 之間壓縮輸出的差異
為了解決Python 的zlib 和Golang 的flate 之間觀察到的不同壓縮結果的問題,需要注意的是,它們使用不同的底層實現。
在 Python 中,使用了 zlib,這是一個基於 DEFLATE 的函式庫,以 zlib 格式輸出資料。另一方面,Golang 採用了 flate,一種 DEFLATE 實作。
輸出差異的原因
觀察到的差異源自於輸出中的第五個位元組:Python 的zlib將其設為0,而Golang 的flate將其設為4。出現這種差異是因為 Python 的 zlib 配置為在壓縮第一個字串後刷新緩衝區,從而有效地截斷輸出。
為了在Golang 中複製Python 的行為,開發人員可以在壓縮器中將Close() 替換為Flush():
<code class="go">func compress(source string) []byte { buf := new(bytes.Buffer) w, _ := flate.NewWriter(buf, 7) w.Write([]byte(source)) w.Flush() return buf.Bytes() }</code>
相容性與相同輸出
但是,重要的是要認識到即使在調整之後Golang 的函數與Python 的匹配,不保證結果的逐字節匹配。確保了壓縮庫之間的兼容性,但可能無法實現相同的輸出。
差異源自於函式庫實現的固有差異以及壓縮過程中使用的特定參數。因此,不建議依賴不同庫之間的位元組對位元組相等。
以上是為什麼 Golang 的「flate」產生與 Python 的「zlib」不同的壓縮輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!