トップ «前の日記(2012-03-02) 最新 次の日記(2012-03-04)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|

2012-03-03 [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入門
丁寧な説明とサンプルが参考になった。

トップ «前の日記(2012-03-02) 最新 次の日記(2012-03-04)» 編集