IOS 压缩与解压字符串(文件) 操作

来源:互联网 发布:网络dj歌曲最红最好听 编辑:程序博客网 时间:2024/05/16 12:32


实现对字符串进行压缩解压操作  前提需要导入libz.1.2.5.dylib 库

#import "BYViewController.h"#import "zipAndUnzip.h"@interface BYViewController ()@end@implementation BYViewController- (void)viewDidLoad{    [super viewDidLoad];    zipAndUnzip *zipAnd = [[zipAndUnzip alloc] init];        NSString *str = @"Hello.madison向显笑";    NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(NSUTF16BigEndianStringEncoding);    NSData *data = [str dataUsingEncoding:enc];    NSData *dataDeflate = [zipAnd gzipDeflate:data];    Byte *byte = (Byte *)[dataDeflate bytes];    for (int i=0 ; i<[dataDeflate length]; i++){            NSLog(@"byte = %d",byte[i]);    }        NSData *adata = [[NSData alloc] initWithBytes:byte length:[dataDeflate length]];//    NSData *dataInflate =  [zipAnd gzipInflate:adata];    NSString *aString = [[NSString alloc] initWithData:adata encoding:enc];    NSLog(@"aString:%@",aString);}@end




@interface zipAndUnzip : NSObject- (NSData *)gzipInflate:(NSData*)data;- (NSData *)gzipDeflate:(NSData*)data;@end

#import "zipAndUnzip.h"#import "zlib.h"@implementation zipAndUnzip//解压缩- (NSData *)gzipInflate:(NSData*)data{    if ([data length] == 0) return data;        unsigned full_length = (int)[data length];    unsigned half_length = (int)[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 = (int)[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] - (uint)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 *)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 = (int)[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] - (uint)strm.total_out;                deflate(&strm, Z_FINISH);            } while (strm.avail_out == 0);        deflateEnd(&strm);        [compressed setLength: strm.total_out];    return [NSData dataWithData:compressed];}@end



0 0