IOS压缩解压缩

#import


压缩

-(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];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 expansiondo {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 *)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];    }    strm.next_out = [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;    }    
}  



本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部