2009-05-29 1 views
3

DeflaterOutputStreamを使用して、独自のアーカイブファイル形式の一部としてデータを圧縮しています。次に、jcraft zlibコードを使用して、反対側のデータを解凍します。もう片方はJ2MEアプリケーションなので、標準的なJavaライブラリではなくサードパーティのZIP圧縮解除コードに依存しています。さまざまなzlib圧縮方式とは何ですか?また、Java Deflaterでデフォルトを強制するにはどうしたらいいですか?

私の問題は、いくつかのファイルがzipして解凍するだけですが、他のファイルは解凍しないということです。

データの最初のバイトの圧縮方法は「5」と思われます。

私はzlibを読んでから、デフォルト値 '8'はデフォルトの圧縮方法を示していることを理解しています。その他の値はデコンプレッサには受け入れられないようです。

私が知りたいのです:

  • '5' とは何を示しているのでしょうか?
  • なぜDeflaterOutputStreamは異なる圧縮方式を使用するのですか?
  • 何とかそれをやめることはできますか?
  • デフォルトの圧縮方法のみを使用する圧縮されたデータを生成する別の方法はありますか?

答えて

6

あなたが見ているものを正確に細かくするのに役立つかもしれません。

通常、データ全体の前に、2バイトのZLIBヘッダーがあります。私が知っている限り、の最初のバイトの下位4ビットは常に8です。あなたがDeflaterをnowrapモードで初期化すると、これらの2バイトはまったく取得されません(ただし、他のライブラリはそれらを取得しなくてはなりません)。

そして、データの各個々のブロックの前に、3ビットのブロックヘッダ(通知、ビットの数として定義されないバイトの整数)があります。おそらく、最終ブロックである圧縮されたブロックを示すバイト5から始まるブロック、または圧縮されていない最終ブロックではないバイト8で始まるブロックを持つことができます。

DeflaterOutputStreamを作成するときに、Deflaterを渡すか、コンストラクタに渡すことができます。そのDefalterには、いくつかのオプションを設定できます。 レベルは、基本的には、データ内の繰り返しパターンを探すときに圧縮が使用するルックアヘッドの量です。 offchanceでこの値をデフォルト以外の値に設定して、デコンプレッサーが対処できるかどうかを確認してください。

戦略設定(setStrategy()メソッドを参照)は、特殊な状況では、デフラータにハフマン圧縮のみを適用するように指示するために使用できます。これは、値の頻度が2のマイナス2乗に近くなるようにデータを変換した場合(ハフマンコーディングが最も効果的に働く分布)に便利なことがあります。私はこの設定がライブラリがあなたのデータを読むことができるかどうかに影響を与えるとは思っていませんが、このような設定を変更しようとするかもしれません。

私が参考にした場合、変換されたデータにハフマンのみの圧縮を使用することを含めて、configuring Deflaterについて少し書いたことがあります。あなたが選択したオプションがあれば、私はあなたのライブラリがデータを読むことができると本当に思います。圧縮データが正しいことが本当にわかっている場合(つまり、ZLIB/Inflaterがファイルを読み直すことができる場合)、別のライブラリを使用することを検討することもできます。

ああ、とにかく言及したいと思いますが、データが修正されれば、もちろんそれを瓶に入れておくと効果的に空気を抜くことができます。皮肉なことに、あなたのJ2MEデバイスはzlibで圧縮されたデータをデコードできなければなりません。それは基本的にjarが入っているフォーマットなので...

+0

Neil、ハフマンのエンコードと周波数などについてどうやって分かりますか? – Cheeso

+0

Aha ..私は不注意に 'nowrap'を設定していた。 ありがとうございます。 – izb

+0

うれしいことが解決しました! Cheeso- freqのことは特別な知識ではありません。標準的な情報理論から逸脱しています。何らかの任意の周波数分布をとると、理想的な符号化では一般的にコードワードに小数のビットが割り当てられますが、これはもちろん不可能です。しかし、理想的なコードは、文字の確率が2の負の累乗(すなわち、1/2,1/4,1/8等)であれば整数を有する。 –

関連する問題