zlibを使ったcompress(圧縮)とuncompress(解凍)について

[戻る]
なおぞう 2016/01/25(月) 22:11:09
お世話になります。
VS2013 Win32 コンソールアプリケーション 
スタティックライブラリでMFCを使用する
共通言語ランタイムサポートを使用しない
で開発中です。

やりたいことは、
zlibを使って、
@複数のファイルを圧縮してひとまとめする。(書庫は作らない?)
Aひとまとめしたものを解凍する。(書庫は作らないで解凍)
という言葉にすると非常に簡単な動作なのですが、どうにもzlibの関数compressと
uncomprssの使い方が分からず(引数の意味や、その内容が全く理解できません)、力を
貸していただきたく投稿させていただきます。
いろいろサイトを調べたのですが、ざっくばらんに書かれていて理解できず、UNIX環境の
ものばかりとかで手も足も出ない状態です。

こんな風に使うんだ。という手順を提示して戴けると助かります。
よろしくお願いします。

現在、zlibのサイトからソースを落としてきて(h.c)コンパイル→zlib.libを生成
zlib.libを開発しているプロジェクトに読み込み(スタティックリンク)、必要なヘッダ
zconf.h,zlib.h,zutil.hをソース元にコピーし、#include "zlib.h"
して、とりあえずcompress()などの関数を認識できるところまでしかできていません。

よろしくお願いします。

瀬戸っぷ [E-Mail] 2016/01/26(火) 10:31:15
試せる環境がありませんが……

https://oku.edu.mie-u.ac.jp/~okumura/compression/zlib.html
とか参考にはならないですか?

compress()/uncompress()で処理しようと思ったら…
>@複数のファイルを圧縮してひとまとめする。(書庫は作らない?)
>Aひとまとめしたものを解凍する。(書庫は作らないで解凍)
の「複数のファイル」をどういう扱いにするか?
という問題が発生するものと思われます。
tar形式のように繋げて一つのバイナリ列にする。とかの工夫が必要になるでしょう。

compress()/uncompress()は、与えられたバイナリ列を圧縮/展開するだけでファイルかど
うかは関与していないみたいですし。

先のページだと「使い方(高次関数)」のcomptest2.cに使用例がありますね。
1K単位で処理する。というサンプルですので渡すデータについてはページ内に説明があり
ます。

tar形式については
http://www.redout.net/data/tar.html
とかで解説されています。
どういう形式でバイナリ列にするか。については任意でしょうから、
ファイル名(100バイト)、データサイズ(4バイト)、データ本体(可変長)とかの単純なパ
ターンでもOKでしょう。

compress()なら第1引数で渡したアドレスから、第2引数で渡したサイズ分の領域に格納さ
れる…かと。
そこら辺のサンプル…となると、試せる環境がないとちょっと面倒ですかね。
# APIの使い方…って事ならスタティックリンクである必要はないのでzlibのDLL利用でも
いいんでしょうけども。

なおぞう 2016/01/27(水) 09:41:21
>瀬戸っぷさま

ご返答ありがとうございます。
compressで、1つのファイルを圧縮するテストプログラムは作れましたが…やはり複数の
ファイルをまとめるというのはデフォルトではできないのですね。
ファイルの名前とか覚えておかないといけないでしょうし。このような対処処理を自分で
ぱぱっとコーディングできればよいのでしょうけど…。

http://see-ku.com/sklib/08.skzipio/index.html
こちらのサイトさんが、(compress利用では無いようですが)複数ファイルを圧縮・解凍
するプログラムを公開しているのでソースを見ているところです。

なおぞう 2016/01/27(水) 20:27:52
[[解決]]
解決はしていないのですが、違う方法を選んだのでこの質問はクローズします。
ありがとうございました。

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