iOS 数据压缩与解压

Posted 小C酱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 数据压缩与解压相关的知识,希望对你有一定的参考价值。

转自: http://blog.csdn.net/dkq972958298/article/details/53321804

 

在实际开发中,我们经常要对比较大的数据进行压缩后再上传服务器,下面是我在项目中压缩数据时所使用的压缩方法:

对数据进行压缩:

 zipAndUnzip *zipAnd = [[zipAndUnzip alloc] init];
    
    NSString *str = @"六六六六了还是德国大使馆和低俗化工及第三方换个撒点恢复健康的十分好的设计哈佛的号发的撒开了凤凰健康的十分健康的沙发";
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    NSData *dataDeflate = [zipAnd gzipDeflate:data];


对数据进行解压:

NSData *dataInflate =  [zipAnd gzipInflate:dataDeflate];
    NSString *aString = [[NSString alloc] initWithData:dataInflate encoding:NSUTF8StringEncoding];


压缩的方法是:

    //压缩  
    - (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 = (uInt)[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] - strm.total_out);  
              
            deflate(&strm, Z_FINISH);  
              
        } while (strm.avail_out == 0);  
          
        deflateEnd(&strm);  
          
        [compressed setLength: strm.total_out];  
        return [NSData dataWithData:compressed];  
    }  

 

解压缩的方法是:

    //解压缩  
    - (NSData *)gzipInflate:(NSData*)data  
    {  
        if ([data length] == 0) return data;  
          
        unsigned long full_length = [data length];  
        unsigned long  half_length = [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 = (uInt)[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] - 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;  
    }  

 

这个压缩实质上是二进制压缩的文件,可以对任何二进制文件进行压缩.









以上是关于iOS 数据压缩与解压的主要内容,如果未能解决你的问题,请参考以下文章

PAT 1078. 字符串压缩与解压

1078. 字符串压缩与解压 (20)

文件压缩与解压-霍夫曼编码

java 解压缩后放到 一个list里。

Java利用Gzip对字符串进行压缩与解压

PAT Basic 1078