本篇文章记录下zlib
的DEFLATE
格式的解压缩技术,在项目开发中用到了此项技术,进过不短时间的查资料才完成解压需求,记录下来已被后续只需:
OC 版本
@interface NSData (STUnzipArchive)
- (NSData *)zlibDeflate;
@end
#import "NSData+STUnzipArchive.h"
#import <zlib.h>
@implementation NSData (STUnzipArchive)
- (NSData *)zlibDeflate
{
if ([self length] == 0) return self;
NSUInteger full_length = [self length];
NSUInteger half_length = [self length] / 2;
NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length];
BOOL done = NO;
int status;
z_stream strm;
strm.next_in = (Bytef *)[self bytes];
strm.avail_in = (unsigned)[self length];
strm.total_out = 0;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
if (inflateInit (&strm) != 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;
}