首頁 >後端開發 >Golang >為什麼 Python 和 Go 的 zlib 實作會對同一字串產生不同的輸出?

為什麼 Python 和 Go 的 zlib 實作會對同一字串產生不同的輸出?

DDD
DDD原創
2024-10-29 05:50:02394瀏覽

  Why Do Python and Go's zlib Implementations Produce Differing Outputs for the Same String?

Python 與Go zlib 輸出差異

在比較Python 和Go 的zlib 實現的輸出時,壓縮字串時會出現明顯的差異“富”。 Python 版本傳回第五位元組設定為 0 的輸出,而 Go 版本則在其位置輸出 4。

壓縮參數

要理解這種差異,請執行以下操作:檢查所使用的壓縮參數至關重要。 Go 程式碼使用 flate.NewWriter,它產生壓縮等級為 7 的 DEFLATE 流。等效的 Python 程式碼利用 DEFLATED 方法和 -15 的壓縮等級初始化 zlib.compressobj。

輸出差異

核心差異在於每個實現的位元組輸出。預設情況下,Python zlib 在使用 zlib.Z_FLUSH 處理輸入後刷新緩衝區。這對應於 Go 實現的 zlib.Z_SYNC_FLUSH。然而,在 Go 程式碼中,對 Writer 物件呼叫 Close() 表示流的結束,並產生完整的 zlib 輸出。

解差

到為了從 Go 程式碼中獲得所需的輸出,Close() 可以替換為 Flush()。此操作模擬 Python 的行為,刷新緩衝區並終止流。或者,要從 Python zlib 取得原始、完整的 DEFLATE 流,可能需要進一步調查,因為預設輸出格式是 zlib 格式。

意義

比較不同壓縮庫的輸出並不是一個可靠的方法。雖然資料應保持相容,但由於實現特定的細微差別,實現位元組到位元組的匹配具有挑戰性。

以上是為什麼 Python 和 Go 的 zlib 實作會對同一字串產生不同的輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn