[Mac][iOS]zlib ファイルの圧縮と解凍 | Cocoa練習帳

[Mac][iOS]zlib ファイルの圧縮と解凍

zipファイルの操作でなく、メモリ上のデータを圧縮/解凍するには、どんな方法がいいのか?


以前、zlibの解説文章を読んだ事があり、全く難解で理解できなかったトラウマがあって、zlibを直接利用する事は避けていたのだが、今、改めて調べてみると、それ程、怖がるものではないように感じている。


という訳で、今回は、直接、zlibを利用する話だ。




OS X / iOSでzlibを利用するのは、簡単だ。"libz.dylib"をプロジェクトに追加するだけでいい。


データを圧縮するコードは以下のとおり。




 #define OUTBUFSIZ   1024
 
- (void)zip:(NSString *)path
{
    NSMutableData   *data = [[NSMutableData alloc] init];
    z_stream   strm;
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;
    deflateInit(&strm, Z_DEFAULT_COMPRESSION);
    char    str[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    strm.next_in = (Bytef *)str;
    strm.avail_in = strlen(str);
    char    buffer[OUTBUFSIZ];
    strm.next_out = (Bytef *)buffer;
    strm.avail_out = OUTBUFSIZ;
 
    int status;
    for (;;) {
        if (strm.avail_in == 0) {
            status = deflate(&strm, Z_FINISH);
        }
        else {
            status = deflate(&strm, Z_NO_FLUSH);
        }
        if (status == Z_STREAM_END) {
            break;
        }
        if (status != Z_OK) {
            DBGMSG(@"deflate: %s", (strm.msg) ? strm.msg : "error");
            break;
        }
        if (strm.avail_out == 0) {
            [data appendBytes:buffer length:OUTBUFSIZ];
            strm.next_out = (Bytef *)buffer;
            strm.avail_out = OUTBUFSIZ;
        }
    }
    if (strm.avail_out != OUTBUFSIZ) {
        [data appendBytes:buffer length:(OUTBUFSIZ - strm.avail_out)];
    }
    deflateEnd(&strm);
    //[data writeToFile:path atomically:YES];
}



文字列strを圧縮するコードだ。圧縮したデータを保存する様にしてみたのだが、これだけだと、zip形式のファイルにならないようで、unzip出来ないので、コメントアウトしている。




ソースコード
GitHubからどうぞ。

https://github.com/murakami/workbook/tree/master/mac/Zip


関連情報
zlib

A Massively Spiffy Yet Delicately Unobtrusive Compression Library

Minizip

Zip and UnZIp additionnal library

ZipArchive

An Objective C class for zip/unzip on iPhone and Mac OSX

objective-zip

An iOS wrapper for ZLib and MiniZip

Objective-CでZIPアーカイブを読み取る

@marvelphさんのブログです。

Objective-Cでzlibを使った圧縮

分かりやすくていい。初めの情報として助かった。

zlib入門

丁寧な説明とサンプルが参考になった。