Java と Go での GZip 圧縮の違い
Java と Go で GZip を使用してデータを圧縮すると、ユーザーはさまざまな結果に遭遇する可能性があります。この記事では、根本的な原因を調査し、同様の出力を達成するための解決策を提供します。
データ型の不一致
不一致の主な理由は、表現に使用される異なるデータ型にあります。これらの言語のバイト。 Java は -128 ~ 127 の範囲の符号付きバイトを使用しますが、Go は 0 ~ 255 の範囲の符号なしバイト (uint8) を使用します。この違いにより、256 を追加して負の Java バイト値を変換する必要があります。
圧縮レベルの変動
バイト値を調整しても、結果が異なる場合があります。これらの言語間でデフォルトの圧縮レベルが異なるため、この問題は持続します。 Java と Go は両方とも最初はレベル 6 圧縮を使用しますが、この値は標準化されておらず、実装が異なる可能性があります。
ハフマン コーディングと LZ77
さらに、GZip はハフマン コーディングを採用しています。データを圧縮するための LZ77 アルゴリズム。これらの手法は、入力文字の頻度に依存して出力コードを割り当てるため、同じ圧縮レベルであっても出力シーケンスに差異が生じる可能性があります。
出力の差異を排除する
同一のものを取得するには出力では、ユーザーは Java と Go の両方で圧縮レベルを 0 (圧縮なし) に設定できます。 Java では、これは def.setLevel(Deflater.NO_COMPRESSION) を設定することで実現できますが、Go では gzip.NewWriterLevel(&buf, gzip.NoCompression).
Java Byte Output Conversion
Java バイト値を符号なし形式で表示するには、ユーザーは byteValue を使用できます。 &0xff。あるいは、値を 16 進数形式で表示すると、署名に関する懸念を回避できます。追加の考慮事項
GZip では、出力にヘッダー フィールドを含めることができます。 Go は gzip.Header 型を通じてこれらのフィールドを組み込みますが、Java はこれらのフィールドを省略します。正確な出力を生成するには、Apache Commons Compress など、ヘッダー フィールドの操作を可能にする Java 用のサードパーティ GZip ライブラリを利用できます。以上がJava と Go で異なる GZip 圧縮出力が生成されるのはなぜですか? それらを同一にするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。