[转]客户端的gzip解压

服务端使用gzip压缩,可以大幅度减小传输包的体积,加快客户端网络请求速度,为用户节省流量。当服务器返回的httpHeader的"Content-Encoding" 属性的值是gzip时,数据会自动被解压缩,但有时候在客户端还没拿到数据的时候,就已经被某些网关解压了,这样gzip就没有起到作用。因此可以约定其他策略,防止网关解压,例如在别的头属性中标记gzip。

如此,就需要我们自己来解压gzip数据。方法如下:添加framework库中的libbz2.1.0.dylib;给nsdata添加方法:

 

- (NSData *)gzipUnpack

{

    if ([self length] == ) return self;

 

    unsigned full_length = [self length];

    unsigned half_length = [self length] / 2;

 

    NSMutableData *decompressed = [NSMutableData dataWithLength: full_length +     half_length];

    BOOL done = NO;

    int status;

 

    z_stream strm;

    strm.next_in = (Bytef *)[self bytes];

    strm.avail_in = [self length];

    strm.total_out = 0;

    strm.zalloc = Z_NULL;

    strm.zfree = Z_NULL;

 

    if (inflateInit2(&strm, (15+32)) != Z_OK) return nil;

    while (!done){

      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];

    }

    return nil;

}

并引入头文件  #import "zlib.h"

将拿到的data直接调用unPack方法就完成解压了。

如果编译出现link error,就到Target的设置,找到"Other Linker Flags"这一项,添加-lz就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值