使用客观的zip解压缩NSData

我刚刚发现Objective Zip我已经阅读了指示,让它在我的项目中build立。 不过,我不知道如何使用它来解压缩一些我想要解压缩的NSData。

我已经看了示例解决scheme,它似乎是在zip文件上执行解压缩代码看起来大致是这样的

ZipFile *unzipFile= [[ZipFile alloc] initWithFileName:filePath mode:ZipFileModeUnzip]; [unzipFile goToFirstFileInZip]; ZipReadStream *read1= [unzipFile readCurrentFileInZip]; 

给予或采取一些其他的指示,这是他们如何显示你使用它,他们的示例代码在这里

我想知道如何做同样的事情,但使用NSData? 或者我将不得不将NSData转换成zipFile? 如果是的话,那么performance如何?

NSData我想解压缩,如果zlib压缩…任何示例代码将是有益的

这里是https://stackoverflow.com/a/6466832/751885

我使用以下两种方法处理NSData

并打电话

 saveToFile 

方法写在磁盘上。

 [[self compressData:uncompressedData] writeToFile:@"fileName.zip" atomically:YES]; 

压缩:

 -(NSData*) compressData:(NSData* )uncompressedData { if ([uncompressedData length] == 0) return uncompressedData; z_stream strm; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; strm.total_out = 0; strm.next_in=(Bytef *)[uncompressedData bytes]; strm.avail_in = (unsigned int)[uncompressedData length]; // Compresssion Levels: // Z_NO_COMPRESSION // Z_BEST_SPEED // Z_BEST_COMPRESSION // Z_DEFAULT_COMPRESSION if (deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY) != Z_OK) return nil; NSMutableData *compressed = [NSMutableData dataWithLength:16384]; // 16K chunks for expansion do { if (strm.total_out >= [compressed length]) [compressed increaseLengthBy: 16384]; strm.next_out = [compressed mutableBytes] + strm.total_out; strm.avail_out = (unsigned int)([compressed length] - strm.total_out); deflate(&strm, Z_FINISH); } while (strm.avail_out == 0); deflateEnd(&strm); [compressed setLength: strm.total_out]; return [NSData dataWithData:compressed]; } 

解压缩:

 -(NSData*) uncompressGZip:(NSData*) compressedData { if ([compressedData length] == 0) return compressedData; NSUInteger full_length = [compressedData length]; NSUInteger 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 = (unsigned int)[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]; } strm.next_out = [decompressed mutableBytes] + strm.total_out; strm.avail_out = (unsigned int)([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; } }