1. 导入libz库(如:libz 1.2.5.dylib)
2. 引入头文件
#import "zlib.h"
3. 实现解压(输入输出都为NSData对象)
-(NSData *)uncompressZippedData:(NSData *)compressedData { if ([compressedData length] == 0) return compressedData; unsigned full_length = [compressedData length]; unsigned half_length = [compressedData length] / 2; NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length]; BOOL done = NO; int status; z_stream strm; strm.next_in = (Bytef *)[compressedData bytes]; strm.avail_in = [compressedData length]; strm.total_out = 0; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; if (inflateInit2(&strm, (15+32)) != Z_OK) return nil; while (!done) { // Make sure we have enough room and reset the lengths. if (strm.total_out >= [decompressed length]) { [decompressed increaseLengthBy: half_length]; } // chadeltu 加了(Bytef *) strm.next_out = (Bytef *)[decompressed mutableBytes] + strm.total_out; strm.avail_out = [decompressed length] - strm.total_out; // Inflate another chunk. status = inflate (&strm, Z_SYNC_FLUSH); if (status == Z_STREAM_END) { done = YES; } else if (status != Z_OK) { break; } } if (inflateEnd (&strm) != Z_OK) return nil; // Set real length. if (done) { [decompressed setLength: strm.total_out]; return [NSData dataWithData: decompressed]; } else { return nil; } }
使用例子:
// gzip解压,mapFilePath为待解压文件路径 NSData *dataInitial = [NSData dataWithContentsOfFile:mapFilePath]; // 解压前 NSData *dataUncompressed = [self uncompressZippedData:dataInitial]; // 解压后
參考博客: