zoukankan      html  css  js  c++  java
  • IOS压缩解压缩

    #import <zlib.h>


    压缩

    -(NSData *)compressData:(NSData *)uncompressedData
    {
        if ([uncompressedData length] == 0) return uncompressedData;
        
        z_stream strm;
        
        strm.zalloc = Z_NULL;
        strm.zfree = Z_NULL;
        strm.opaque = Z_NULL;
        strm.total_out = 0;
        strm.next_in=(Bytef *)[uncompressedData bytes];
        strm.avail_in = (unsigned int)[uncompressedData length];
        
        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 = (unsigned int)([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 *)uncompressZippedData:(NSData *)compressedData    
    {    
     
        if ([compressedData length] == 0) return compressedData;    
     
        unsigned full_length = [compressedData length];    
     
        unsigned half_length = [compressedData length] / 2;    
        NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length];    
        BOOL done = NO;    
        int status;    
        z_stream strm;    
        strm.next_in = (Bytef *)[compressedData bytes];    
        strm.avail_in = [compressedData 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 = [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;    
        }    
    }  


  • 相关阅读:
    自建 IPA 分发平台
    一个优雅的占位图解决方案。适用于 UITableView 和 UICollectionView。
    Vuejs2.0购物车和地址选配学习笔记
    UIWebView 加 MJRefresh 同时解决底部黑影问题
    UIWebView 不自动全屏播放视频
    左右分页按钮的集合视图控件。用于快速编写出集合视图上分页多按钮点击事件!
    课程总结
    IO流实训
    事件处理
    变色
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6842770.html
Copyright © 2011-2022 走看看