Java と Go で gzip 出力が異なる理由
Java と Go で gzip を使用して「helloworld」を圧縮すると、結果のバイト シーケンスが異なります。この矛盾は、データ表現と圧縮アルゴリズムの影響における根本的な違いに起因します。
データ表現
Java は符号付きバイト型 (-128 ~ 127) を使用しますが、Go は符号付きバイト型 (-128 ~ 127) を使用します。符号なしバイト型 (0 ~ 255)。負の Java バイト値は、Go の対応するバイト値と比較するために 256 シフトする必要があります。
圧縮アルゴリズム
Gzip は LZ77 およびハフマン コーディングを利用します。これらのアルゴリズムは、入力文字の頻度に基づいてツリーを構築します。異なる入力とビット パターンが同じコードにマップされる場合があり、その結果、出力シーケンスが変化することがあります。
デフォルトの圧縮レベル
両方の Java でデフォルトの圧縮レベルを 6 に指定しているにもかかわらず、と Go では、実装は異なる値を選択したり、時間の経過とともに変更したりする場合があります。
同一性の確保出力
同一の出力を強制するには、両方の言語で圧縮レベルを 0 に設定します:
ヘッダー フィールド
Gzip には、Go が自動的に追加するオプションのヘッダー フィールドが含まれていますが、Java には含まれていません。同一の出力を生成するには、Java にはこれらのフィールドの設定をサポートするサードパーティ ライブラリが必要です。
実用的な意味
出力シーケンスは異なる場合がありますが、Java と Go は両方とも任意の gzip デコーダで解凍できる有効な gzip 圧縮データを生成します。したがって、不一致はデータ交換や整合性に実質的な影響を与えません。
以上が同じ入力と圧縮レベルを使用しているにもかかわらず、Java と Go で異なる GZIP 出力が生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。