まずは手始めにzlibによる、データの圧縮方法について学びましょう。

 zlibはオブジェクト指向の概念がないC言語で開発されているため、クラスの代替策として専用の構造体に必要なデータを代入し、圧縮・解凍関数にそのデータを逐一渡すことで処理を行っています。構造体の中には関数内の処理のためだけにあり、プログラマが決して手を出してはいけない変数も含まれますので注意しましょう(C++だったらprivate属性にすることでアクセスをブロックできるのですが)。

 まずは、zlibに関するヘッダファイル「zlib.h」「zconf.h」の2つをインクルードします。続いて、メイン関数において、基本となる構造体「z_stream」を作成し、それをC++のコンストラクタに当たる圧縮初期化関数「deflateInit」にわたします。初期化関数にデータを渡す前に、圧縮のためのメモリ領域確保方法を指定しなくてはなりません。「z_stream.zalloc」にはメモリ確保を行う独自関数のポインタ、「z_stream.zfree」にはメモリ解放を行う独自関数のポインタ、「z_stream.opaque」には、メモリ確保/解放時に渡すオプションデータへのポインタを指定します。ただし、これらすべてに「Z_NULL(0)」を代入すると、メモリ処理はzlib標準の関数が適用されるため、特別な理由がない限りは「Z_NULL」による指定で構いません。deflateInitの第2引数にはデータの圧縮率を指定します。9で最高圧縮、0で無圧縮、Z_DEFAULT_COMPRESSION(-1)で標準的な圧縮となります。初期化に成功すれば「Z_OK(0)」が返されます。