メモリ上にzipデータをすべて読み込み、メモリ上でZip形式のデータ解凍を行う方法を
探しています。解凍データもファイルではなく、メモリに格納します。
用途は、サーバからZip圧縮されたデータをクライアントで受信、ファイルにはせずに、
メモリ上で解凍するためです。
使用できるAPIやライブラリをご存知の方がいましたら、教えていただけないでしょう
か? よろしくお願いいたします。
やはりzlibでしょうか。
.zip なのか .gz なのかで違いそう・・・
libzip っつのもあるけど。
フリーソフトをお仕事に使ってよいか?サポート的にもライセンス的にも
は要検討っつことで。
ありがとうございます。
zlibについて少し調べてみます。
また、unzip32.dllを使用できないかを調べていますが、これは使用できないのでしょう
か?
ドキュメントを検索していますが、なかなか見つかりません。
>>tetrapodさん
.zipを使用しています。
開発環境は Visual Studio2008になります。
unzip32に関してはSDKをダウンロードしないといけないのですが、
ダウンロードされましたか?
SDKの中にUNZIP32.dllのAPIの説明書があるはずなので
それで確認してみてください。
説明書の中に該当する関数があれば使えるでしょうし、
なければ使えないという事になると思います。
>>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
サーバーってUNIX系?、WINDOWS系?
というのは、サーバ側とクライアント側で違うライブラリーを使っているのが
気になりますね。
解凍してファイルとし保存するならまだしも、メモリー上で回答するとなると食い違い
がでてくるのではないでしょうか?
Zlibを使うなら、サーバー側もZlibを使わないとまずいのではないですか?
サイトを見ると一様互換性があるみたいですが、メモリー上の解凍でも互換性が
あるか不安ですね。
>ファイルにはせずに、メモリ上で解凍するためです
一度ファイルにして確かめてみたらどうですか。
>サーバ側は、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()を呼ぶ前にストリームを閉じていないから
配列への書き込みが完了してないのかも?
>配列への書き込みが完了してないのかも?
配列というかByteArrayOutputStreamへの書き込みのことです。
inflateは結果バッファが足りんと泣いてるな
destバッファのサイズをどう決めたのか?
文字コード指定みたいのあるがそれで変換されてサイズ変わってないか?
このあたりはどうだろうか?