zlib

zlib is designed to be a free, general-purpose, legally unencumbered -- that is, not covered by any patents -- lossless data-compression library for use on virtually any computer hardware and operating system. The zlib data format is itself portable across platforms. Unlike the LZW compression method used in Unix compress(1) and in the GIF image format, the compression method currently used in zlib essentially never expands the data. (LZW can double or triple the file size in extreme cases.) zlib's memory footprint is also independent of the input data and can be reduced, if necessary, at some cost in compression. A more precise, technical discussion of both points is available on another page.

zlib
http://www.zlib.net/

使い方

 Visual C++ 6.0での超簡単な使い方です。説明をするよりも、ソースコードを読んでください。以下のように、1次元の配列データをcompress2()関数を使って圧縮します。伸長は、decompress()を使って行います。

 compress2()の *destには、圧縮前のデータサイズの 1.1倍 + 12byteの容量を確保します。int levelには、圧縮レベルを整数で 0 (無圧縮) 〜 9 (最高圧縮)の値を指定します。

/*
    Compresses the source buffer into the destination buffer. The level
  parameter has the same meaning as in deflateInit.  sourceLen is the byte
  length of the source buffer. Upon entry, destLen is the total size of the
  destination buffer, which must be at least the value returned by
  compressBound(sourceLen). Upon exit, destLen is the actual size of the
  compressed buffer.

    compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
  memory, Z_BUF_ERROR if there was not enough room in the output buffer,
  Z_STREAM_ERROR if the level parameter is invalid.
*/
ZEXTERN int ZEXPORT compress2 OF((
                              Bytef *dest,
                              uLongf *destLen,
                              const Bytef *source,
                              uLong sourceLen,
                              int level));
/*
    Decompresses the source buffer into the destination buffer.  sourceLen is
  the byte length of the source buffer. Upon entry, destLen is the total
  size of the destination buffer, which must be large enough to hold the
  entire uncompressed data. (The size of the uncompressed data must have
  been saved previously by the compressor and transmitted to the decompressor
  by some mechanism outside the scope of this compression library.)
  Upon exit, destLen is the actual size of the compressed buffer.
    This function can be used to decompress a whole file at once if the
  input file is mmap'ed.

    uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
  enough memory, Z_BUF_ERROR if there was not enough room in the output
  buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.
*/

ZEXTERN int ZEXPORT uncompress OF((
                               Bytef *dest,
                               uLongf *destLen,
                               const Bytef *source,
                               uLong sourceLen));

サンプル

 以下のサイトから、DLLとlibをダウンロードして、zdll.libファイルをソースコードと同一ディレクトリに置いてください。zlib.dllは、コンパイル後の実行ファイルと同一ディレクトリに置いてください。

 zdll.libを使わない場合は、zlibのソースコードを通常のプログラムと一緒にコンパイル・リンクするだけで、動くようになります。とても簡単です。

http://www.zlib.net/zlib123-dll.zip

#include <stdio.h>
#include <stdlib.h>

#include "zlib.h"
#pragma comment(lib, "zdll.lib")

int main(int argc, char *argv[])
{
    char data[128];              /* オリジナルデータ */
    char comp[128 + 20 + 12];    /* 圧縮後のデータ */
    char decomp[128];            /* 伸長後のデータ. 異常がなければオリジナルと等しくなる */
    int comp_size;               /* 圧縮後のデータサイズ */
    int decomp_size;             /* 伸長後のデータサイズ */

    /* 圧縮 */
    comp_size = (int)( (sizeof(data) * 1.1) + 12);
    compress2(comp, &comp_size, data, sizeof(data), 5);

    /* 伸長 */
    decomp_size = sizeof(data);
    uncompress(decomp, &decomp_size, comp, comp_size);

    return(0);
}

 このサンプルは、コンパイルチェックなどをしてないので、大筋では問題ないハズですが、細かい部分で動かない可能性があります。すいません。