zlib は圧縮アルゴリズムをライブラリ化したものです.
http://zlib.net/
簡単な使い方は,奥村晴彦氏が zlib
入門にて説明しています.
http://oku.edu.mie-u.ac.jp/~okumura/compression/zlib.html
zlib の基本関数を利用して,
ファイルを圧縮したり復元したりするサンプルを作成してみました.
圧縮と復元で違いはほとんどありませんが,
deflate 系の関数と
inflate 系の関数を使い分けるだけでなく,
エラーの種類が少し異なることにも注意する必要があります.
sample-deflate.c (圧縮のサンプル)
sample-inflate.c (復元のサンプル)
実際のところ,gzopen,
gzclose,gzread,
gzwrite などの関数が用意されているので,
zlib 単体でもファイル入出力は簡単に実現できます.
sample-gz.c
ZlibIO は, zlib を利用して ファイル入出力を行うためのライブラリです.
データを圧縮しながらファイルに書き出したり, 圧縮ファイルを復元しながら読み込んだりできます. 逆に,圧縮データを復元しながらファイルに書き出したり, ファイルを圧縮しながら読み込んだりできます. この少しアレゲな機能が,ZlibIO を利用する理由になるかもしれません.
zlibio.h からの抜粋になりますが, 以下のような構造体を提供します.
// ライブラリのハンドル typedef struct ZIO *hZIO;
// メモリ上のデータ typedef struct ZMem { void *buf; // バッファ int avail; // バッファ中の有効なバイト数 int size; // バッファサイズ } ZMem, *hZMem;
zlibio.h からの抜粋になりますが, 以下のような関数を提供します.
// src を圧縮して dst に出力する int ZIO_Compress( const char *src, const char *dst );
// src を復元して dst に出力する int ZIO_Decompress( const char *src, const char *dst );
// ファイルを開く // mode には [i][rw][0-9] を指定する // i: 指定すると,読み込み時に圧縮,書き込み時に復元 // rw: 読み込みもしくは書き込み // 0-9: 圧縮レベル(6: 初期設定, 0: 低圧縮率で高速, 9: 高圧縮率で低速) int ZIO_Open( hZIO *h, const char *path, const char *mode );
// ハンドルを破棄する int ZIO_Close( hZIO h );
// ファイルからデータを読み込み int ZIO_Read( hZIO h, void *buf, int n );
// データをファイルに書き込む int ZIO_Write( hZIO h, const void *buf, int n );
// path を mode に従って圧縮もしくは復元し,メモリ上に展開する // h->buf が NULL であれば,動的にメモリを確保する int ZMem_Load( hZMem h, const char *path, const char *mode );
// メモリ上のデータを mode に従って圧縮もしくは復元し,path に出力する int ZMem_Save( hZMem h, const char *path, const char *mode );
sample.c と sample-cmd.c を参考にしてください.
何の予定もありません.
zlib.h を参考にしました.
バージョンが若干古いですが, zlib 1.1.4 Manual も参考にしました.