メモリに読み込んだZipデータの解凍方法 – プログラミング – Home

メモリに読み込んだZipデータの解凍方...
 
通知
すべてクリア

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


マサヤ
 マサヤ
(@マサヤ)
ゲスト
結合: 15年前
投稿: 3
Topic starter  

メモリ上にzipデータをすべて読み込み、メモリ上でZip形式のデータ解凍を行う方法を
探しています。解凍データもファイルではなく、メモリに格納します。

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

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


引用解決済
トピックタグ
ISLe
 ISLe
(@ISLe)
ゲスト
結合: 18年前
投稿: 38
 

やはりzlibでしょうか。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

.zip なのか .gz なのかで違いそう・・・
libzip っつのもあるけど。

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


返信引用
マサヤ
 マサヤ
(@マサヤ)
ゲスト
結合: 15年前
投稿: 3
Topic starter  

ありがとうございます。
zlibについて少し調べてみます。
また、unzip32.dllを使用できないかを調べていますが、これは使用できないのでしょう
か?
ドキュメントを検索していますが、なかなか見つかりません。

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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


返信引用
マサヤ
 マサヤ
(@マサヤ)
ゲスト
結合: 15年前
投稿: 3
Topic starter  

>>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
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

サーバーってUNIX系?、WINDOWS系?
というのは、サーバ側とクライアント側で違うライブラリーを使っているのが
気になりますね。

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

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


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>ファイルにはせずに、メモリ上で解凍するためです
一度ファイルにして確かめてみたらどうですか。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>サーバ側は、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
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>配列への書き込みが完了してないのかも?

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


返信引用
rin
 rin
(@rin)
ゲスト
結合: 18年前
投稿: 112
 

inflateは結果バッファが足りんと泣いてるな

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました