变更记录
序号 | 录入时间 | 录入人 | 备注 |
---|---|---|---|
1 | 2016-10-13 | Alfred Jiang | - |
方案名称
NSData - NSData 数据压缩与解压缩
关键字
NSData \ 文件 \ 压缩与解压缩
需求场景
- 需要对 NSData 进行压缩解压缩存取时
参考链接
详细内容
NSData+Compresssion.h
//
// NSData+Compresssion.h
// JDiPadNetworking
//
// Created by viktyz on 16/10/13.
// Copyright © 2016年 Alfred Jiang. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSData (Compresssion)
- (NSData *)compresssion;
- (NSData *)deCompresssion;
@end
NSData+Compresssion.m
//
// NSData+Compresssion.m
// JDiPadNetworking
//
// Created by viktyz on 16/10/13.
// Copyright © 2016年 Alfred Jiang. All rights reserved.
//
#import "NSData+Compresssion.h"
#include <zlib.h>
@implementation NSData (Compresssion)
- (NSData *)compresssion
{
if ([self length] == 0) return self;
unsigned full_length = (unsigned) self.length;
unsigned half_length = (unsigned) 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 = (uInt) self.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;
}
- (NSData *)deCompresssion
{
if ([self length] == 0) return self;
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.total_out = 0;
strm.next_in=(Bytef *)self.bytes;
strm.avail_in = (uInt) self.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];
}
@end
效果图
(无)
备注
(无)