IOS压缩解压缩

#import <zlib.h>


压缩

-(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 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 *)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;    
    }    
}  


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。