3

DeflaterOutputStream を使用して、独自のアーカイブ ファイル形式の一部としてデータを圧縮しています。次に、jcraft zlib コードを使用して、相手側でそのデータを解凍します。もう一方の端は J2ME アプリケーションであるため、標準の Java ライブラリではなく、サードパーティの zip 解凍コードに依存しています。

私の問題は、一部のファイルは正常に圧縮および解凍され、他のファイルはそうでないことです。

そうでないものについては、データの最初のバイトの圧縮方法は「5」のようです。

zlib を読んだところ、デフォルト値の '8' がデフォルトの deflate 圧縮方法を示していることがわかりました。他の値は、デコンプレッサに受け入れられないように見えます。

私が知りたいのは:

  • 「5」は何を示していますか?
  • DeflaterOutputStream が時々異なる圧縮方法を使用するのはなぜですか?
  • どうにかしてそれを止めることはできますか?
  • デフォルトの圧縮方法のみを使用するデフレートされたデータを生成する別の方法はありますか?
4

1 に答える 1

7

見ているものを正確に絞り込むのに役立つ場合があります。

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

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

DeflaterOutputStream を作成するときに、Deflater または選択したものをコンストラクターに渡すことができます。その Deflater には、設定できるオプションがいくつかあります。レベルは基本的に、データ内の繰り返しパターンを探すときに圧縮が使用する先読みの量です。場合によっては、これをデフォルト以外の値に設定してみて、解凍プログラムが処理できるかどうかに違いがあるかどうかを確認してください。

ストラテジー設定 ( setStrategy() メソッドを参照) は、ハフマン圧縮のみを適用するようにデフレーターに指示するために、いくつかの特別な状況で使用できます。これは、値の度数が 2 の負の累乗に近い値 (つまり、ハフマン コーディングが最適に機能する分布) になるようにデータを既に変換している場合に役立つことがあります。この設定がライブラリがデータを読み取れるかどうかに影響するとは思いませんが、偶然に、この設定を変更してみてください。

役立つ場合は、変換されたデータでのハフマンのみの圧縮の使用など、 Deflater の構成について少し書きました。どのようなオプションを選択したとしても、ライブラリがデータを読み取れることを本当に期待しています。圧縮データが正しいと確信している場合 (つまり、ZLIB/Inflater がファイルを再読み込みできる場合)、別のライブラリを使用することを検討してください...!

ああ、出血は明らかですが、とにかく言及します。データが修正されている場合は、もちろんそれを瓶に貼り付けるだけで、効果的に「無料で」収縮/膨張します。皮肉なことに、J2ME デバイスは zlib で圧縮されたデータをデコードできなければなりません。

于 2009-05-29T17:36:54.303 に答える