Objective c 使用objective zip解压NSData

Objective c 使用objective zip解压NSData,objective-c,ios,zlib,unzip,Objective C,Ios,Zlib,Unzip,我最近才发现我一直在阅读说明书,以便在我的项目中进行设置。然而,我真的不知道如何使用它来解压我想要解压的一些NSData 我已经看过这个示例解决方案,它似乎是在一个zip文件上执行解压缩,代码大致如下 ZipFile *unzipFile= [[ZipFile alloc] initWithFileName:filePath mode:ZipFileModeUnzip]; [unzipFile goToFirstFileInZip]; ZipReadStream *read1= [unzipF

我最近才发现我一直在阅读说明书,以便在我的项目中进行设置。然而,我真的不知道如何使用它来解压我想要解压的一些NSData

我已经看过这个示例解决方案,它似乎是在一个zip文件上执行解压缩,代码大致如下

ZipFile *unzipFile= [[ZipFile alloc] initWithFileName:filePath mode:ZipFileModeUnzip];

[unzipFile goToFirstFileInZip];
ZipReadStream *read1= [unzipFile readCurrentFileInZip];
给出或接受一些其他说明这是他们向您展示如何使用它的方式,他们的示例代码是

我想知道如何使用NSData做同样的事情?或者我必须将NSData转换成zipFile?如果是,如何正确执行

如果zlib被压缩,我试图解压缩的NSData。。。任何示例代码都会很有帮助

我使用以下两种方法处理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;
}
}
给你

我使用以下两种方法处理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;
}
}

天哪,如果我有一些zlib压缩的NSData,我只需将底部的方法添加到我的.m文件中,然后从哪个方法调用它?当你说call**saveToFile**如果我只需要返回的未压缩NSData怎么办?我可以随时使用它吗?我刚刚将它添加到我当前的.m文件中,在那里我需要使用它。除了z_流和strm对象之外,一切似乎都正常。。他们在制造错误。。你知道我需要做些什么来解决这个问题吗?我阅读了你发给我的另一个链接,但这并没有真正起到帮助作用,因为这与你在这里发布的内容是一样的,如果能得到更多帮助,我们将不胜感激。[[self compressData:oriNSData]writeToFile:@“fileName”原子性:是]好的,我试着通过解压方法运行我的zlib编码的NSData,它总是返回零。。我穿过它,它又回来了;在else if(status!=Z_OK)中,您有什么建议吗?例如,我需要为这个方法使用gziped NSdata吗?天哪,如果我有一些zlib压缩的NSdata,我只需要将底部的方法添加到我的.m文件中,然后从哪个方法调用它?当你说call**saveToFile**如果我只需要返回的未压缩NSData怎么办?我可以随时使用它吗?我刚刚将它添加到我当前的.m文件中,在那里我需要使用它。除了z_流和strm对象之外,一切似乎都正常。。他们在制造错误。。你知道我需要做些什么来解决这个问题吗?我阅读了你发给我的另一个链接,但这并没有真正起到帮助作用,因为这与你在这里发布的内容是一样的,如果能得到更多帮助,我们将不胜感激。[[self compressData:oriNSData]writeToFile:@“fileName”原子性:是]好的,我试着通过解压方法运行我的zlib编码的NSData,它总是返回零。。我穿过它,它又回来了;在else if(status!=Z_OK)中,您有什么建议吗?例如,对于这个方法,我需要使用gziped NSdata吗?