メモリに読み込んだZipデータの解凍方法

[戻る]
マサヤ 2009/09/14(月) 15:04:44
メモリ上にzipデータをすべて読み込み、メモリ上でZip形式のデータ解凍を行う方法を
探しています。解凍データもファイルではなく、メモリに格納します。

用途は、サーバからZip圧縮されたデータをクライアントで受信、ファイルにはせずに、
メモリ上で解凍するためです。

使用できるAPIやライブラリをご存知の方がいましたら、教えていただけないでしょう
か? よろしくお願いいたします。

ISLe 2009/09/14(月) 16:32:11
やはりzlibでしょうか。

tetrapod 2009/09/14(月) 16:46:09
.zip なのか .gz なのかで違いそう・・・
libzip っつのもあるけど。

フリーソフトをお仕事に使ってよいか?サポート的にもライセンス的にも
は要検討っつことで。

マサヤ 2009/09/14(月) 21:03:29
ありがとうございます。
zlibについて少し調べてみます。
また、unzip32.dllを使用できないかを調べていますが、これは使用できないのでしょう
か?
ドキュメントを検索していますが、なかなか見つかりません。

>>tetrapodさん
.zipを使用しています。
開発環境は Visual Studio2008になります。

PATIO 2009/09/15(火) 11:03:55
unzip32に関してはSDKをダウンロードしないといけないのですが、
ダウンロードされましたか?
SDKの中にUNZIP32.dllのAPIの説明書があるはずなので
それで確認してみてください。
説明書の中に該当する関数があれば使えるでしょうし、
なければ使えないという事になると思います。

マサヤ 2009/09/16(水) 12:11:05
>>PATIOさん
ありがとうございます。
unzip32のSDKをダウンロードしてみまして、他のライブラリと比較してみましたが
今のところ、サーバ側でjzlibを使用しストリーム圧縮したデータをクライアント側で
zlibライブラリのuncompress()を使用して展開する方法で一応展開できたので、この方
法を調べています。

ただ、サーバからの受信データをuncompress()で展開したところ、
ZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,
                                   const Bytef *source, uLong sourceLen));

展開後のdestは正常な展開データが入るのですが、destLenが入力した値のままで展開後
のデータサイズが返らない。戻り値が"Z_DATA_ERROR(-3)"が返ってくる現象が起こりま
す。
uncompress()の内部をトレースしたところ
内部のinflate()で失敗して"Z_BUF_ERROR(-5)"が返ってきています。


サーバ側は、jzlibライブラリを使用して、以下のようにしてzip圧縮を行っています。
  ByteArrayOutputStream bOut = new ByteArrayOutputStream();
  ZOutputStream fout = new ZOutputStream(bOut, 9);
  fout.setFlushMode(3);
  PrintStream pOut = new PrintStream(fout, true, "UTF-8");
  pOut.println("圧縮内容");
  bOut.toByteArray()


少し、マニアックな質問になりましたが、このあたりの事をご存知の方がいましたら
ご教授おねがいいたしますm(_ _)m

ITO 2009/09/16(水) 13:18:12
サーバーってUNIX系?、WINDOWS系?
というのは、サーバ側とクライアント側で違うライブラリーを使っているのが
気になりますね。

解凍してファイルとし保存するならまだしも、メモリー上で回答するとなると食い違い
がでてくるのではないでしょうか?
Zlibを使うなら、サーバー側もZlibを使わないとまずいのではないですか?

 サイトを見ると一様互換性があるみたいですが、メモリー上の解凍でも互換性が
あるか不安ですね。

ITO 2009/09/16(水) 13:21:40
>ファイルにはせずに、メモリ上で解凍するためです
一度ファイルにして確かめてみたらどうですか。

subaru 2009/09/16(水) 14:41:14
>サーバ側は、jzlibライブラリを使用して、以下のようにしてzip圧縮を行っています。
>  ByteArrayOutputStream bOut = new ByteArrayOutputStream();
>  ZOutputStream fout = new ZOutputStream(bOut, 9);
>  fout.setFlushMode(3);
>  PrintStream pOut = new PrintStream(fout, true, "UTF-8");
>  pOut.println("圧縮内容");
>  bOut.toByteArray()

bOut.toByteArray()を呼ぶ前にストリームを閉じていないから
配列への書き込みが完了してないのかも?

subaru 2009/09/16(水) 14:43:56
>配列への書き込みが完了してないのかも?

配列というかByteArrayOutputStreamへの書き込みのことです。

rin 2009/09/16(水) 16:17:33
inflateは結果バッファが足りんと泣いてるな

destバッファのサイズをどう決めたのか?
文字コード指定みたいのあるがそれで変換されてサイズ変わってないか?
このあたりはどうだろうか?

古いスレッドには追加発言できません。