ios 字符串压缩

实现对字符串进行压缩解压操作  前提需要导入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
————————————————
版权声明:本文为CSDN博主「xiangxx@酷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011043997/article/details/25381699

猜你喜欢

转载自blog.csdn.net/cola_wh/article/details/107408184