在实际开发中,我们经常要对比较大的数据进行压缩后再上传服务器,下面是我在项目中压缩数据时所使用的压缩方法:

对数据进行压缩:

zipAndUnzip *zipAnd = [[zipAndUnzip alloc] init];

NSString *str = @”六六六六了还是德国大使馆和低俗化工及第三方换个撒点恢复健康的十分好的设计哈佛的号发的撒开了凤凰健康的十分健康的沙发”;
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSData *dataDeflate = [zipAnd gzipDeflate:data];

对数据进行解压:

NSData *dataInflate =  [zipAnd gzipInflate:dataDeflate];
NSString *aString = [[NSString alloc] initWithData:dataInflate encoding:NSUTF8StringEncoding];

压缩的方法是:

//压缩
– (NSData *)gzipDeflate:(NSData*)data
{
if ([data length] == 0) return data;

z_stream strm;

strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.total_out = 0;
strm.next_in=(Bytef *)[data bytes];
strm.avail_in = (uInt)[data 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 = (uInt)([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 *)gzipInflate:(NSData*)data
{
if ([data length] == 0) return data;

unsigned long full_length = [data length];
unsigned long half_length = [data length] / 2;

NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length];
BOOL done = NO;
int status;

z_stream strm;
strm.next_in = (Bytef *)[data bytes];
strm.avail_in = (uInt)[data 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 = (uInt)([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;
}

这个压缩实质上是二进制压缩的文件,可以对任何二进制文件进行压缩