zoukankan      html  css  js  c++  java
  • iOS gzip解压

    1. 导入libz库(如:libz 1.2.5.dylib)

    2. 引入头文件

    #import "zlib.h"

    3. 实现解压(输入输出都为NSData对象)

    -(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];
            }
            // chadeltu 加了(Bytef *)
            strm.next_out = (Bytef *)[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;
        }
    }
    


    使用例子:

    // gzip解压,mapFilePath为待解压文件路径
    NSData *dataInitial = [NSData dataWithContentsOfFile:mapFilePath];	// 解压前
    NSData *dataUncompressed = [self uncompressZippedData:dataInitial];	// 解压后


    參考博客:

    在iPhone开发中实现解压缩gzip


  • 相关阅读:
    4. Postman测试集的批量执行(转)
    3. Postman Tests断言(转)
    2. Postman发送各种格式请求的方法
    1. Postman的安装
    2. Django创建项目
    Redis学习笔记(一)
    Oracle连接查询
    Redis学习笔记(五)- 数据类型之set类型
    Redis学习笔记(四)-数据类型之list类型
    PL/SQL实现JAVA中的split()方法的小例子
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6951317.html
Copyright © 2011-2022 走看看