ホームページ >バックエンド開発 >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 バージョンは 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。