」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼 Python 和 Golang Zlib 會產生不同的壓縮輸出?

為什麼 Python 和 Golang Zlib 會產生不同的壓縮輸出?

發佈於2024-11-08
瀏覽:923

Why Do Python and Golang Zlib Produce Different Compressed Outputs?

了解Golang 和Python Zlib 輸出的差異

使用Zlib 壓縮來壓縮字串時,Python 的zlib 函式庫會產生與Golang 的zlib 實作。具體來說,第五個位元組不同,Python 的值為 0,而 Golang 的值為 4。

差異原因

輸出的差異源自於來自 Python 和 Go 函式庫所使用的不同刷新機制。 Python的zlib預設為Z_FLUSH,它在壓縮每個資料塊後刷新緩衝區。相較之下,Golang 的 flate 函式庫實作了 Zlib,預設使用 Z_SYNC_FLUSH。此行為會在處理整個輸入流後刷新資料。

如何在Golang 中獲得相同的輸出

要獲得與Python 的zlib 相同的輸出,請替換Go代碼中的Close()和Flush():

func compress(source string) []byte {
    buf := new(bytes.Buffer)
    w, _ := flate.NewWriter(buf, 7)
    w.Write([]byte(source))
    w.Flush()

    return buf.Bytes()
}

位元組與完整流

需要注意的是,Python 範例的輸出不是完整流。它僅在壓縮第一個字串後刷新緩衝區。

位元組到位元組匹配的限制

比較不同壓縮庫的位元組到位元組輸出匹配壓縮資料一般是不可行或不實用的。壓縮庫產生的輸出保證是相容的,而不是相同的。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3