Python と Go の zlib 出力の不一致
Python と Go の zlib 実装の出力を比較すると、文字列 " を圧縮するときに顕著な違いが生じます。ふー」。 Python バージョンは 5 番目のバイトが 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 中国語 Web サイトの他の関連記事を参照してください。