iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
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出来ないので、コメントアウトしている。