`

[转]客户端的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就可以了。

分享到:
评论

相关推荐

    利用JAVASCRIPT即你想那个GZIP压缩与解压缩

    利用JAVASCRIPT即你想那个GZIP压缩与解压缩 最近流行的网络游戏(FLASH)数据传输都是用GZIP进行压缩与解压缩的,在客户端FLASH对与服务器交互的数据进行解压缩,

    php对gzip文件或者字符串解压实例参考

    要采集一个网站,目标站采用了gzip压缩传输网页,本来应该只要发送一个http头 Accept-Encoding: identity或者干脆不发送这个头等,就可以使目标站返回没有经过gzip压缩的页面了,不过很不幸,目标站无视客户端的请求...

    Arduino-T002-Laser-Tank-Base64:本教程讲解如何结合使用Base64和gzip压缩来减少Arduino代码库的大小。 您创建一个自定义网页,将其gzip压缩,编码为Base64,然后将其保存到Arduino。 建立连接后,您可以将其发送到客户端,然后关闭并运行

    这个过程很简单,您可以创建一个自定义网页,对其进行gzip处理,并使用Base64对其进行编码,然后将其保存到Arduino中。 建立连接后,您的Arduino Web服务器将对其进行解码,然后将其传输到客户端。 然后,客户端...

    pgsql-gzip:适用于PostgreSQLGzip压缩和解压缩

    PostgreSQL gzip / gunzip函数 动机 有时,您只需要压缩bytea对象,然后再将其返回给客户端即可。 有时,您会从客户端收到压缩的bytea ,因此必须先对其进行解压缩,然后才能使用它。 此扩展用于此。 此扩展名不...

    GZip流压缩&Web流压缩组件

    default.asp 第二个产品的例子,用于客户端处理处理接受文件,GZip流  如果您有好的建议或BUG汇报,请邮件给我,我先表示感谢。  重要说明,此软件不允许使用于商业用途,否则会受到牵连。  另注,由于本...

    IIS启用Gzip的方法与优缺点分析

    现代的浏览器IE6和Firefox都支持客户端Gzip,也就是说,在服务器上的网页,传输之前,先使用Gzip压缩再传输给客户端,客户端接收之后由浏览器解压显示,这样虽然稍微占用了一些服务器和客户端的CPU,但是换来的是更...

    IIS6.0下的Gzip.dll

    先使用Gzip压缩再传输给客户端,客户端接收之后由浏览器解压显示,这样虽然稍微占用了一些服务器和客户端的CPU,但是换来的是更高的带宽利用率。对于纯文本来讲,压缩率是相当可观的。如果每个用户节约50%的带宽,...

    独立主机/VPS 一键开启IIS的GZIP方法

    现代的浏览器IE6和Firefox都支持客户端Gzip,也就是说,在服务器上的网页,传输之前,先使用Gzip压缩再传输给客户端,客户端接收之后由浏览器解压显示,这样虽然稍微占用了一些服务器和客户端的CPU,但是换来的是更...

    zlib库压缩和解压字符串STL string的实例详解

    1.zlib库可以实现gzip和zip方式的压缩, 这里只介绍zip方式的二进制压缩, 压缩比还是比较可观的, 一般写客户端程序已足够. 2.修改了一下zpipe.c的实现, 其实就是把读文件改为读字符串, 写文件改为写字符串即可. 例子 ...

    AMFTP (FTP) 2.0.zip

    FTP上传管理工具 - AMFTP AMFTP - WEB FTP管理客户端 ...04) 压缩: Linux 环境全面支持 zip tar gzip(tar.gz) 格式解压与压缩。 05) 权限: 支持在线全面设置文件权限属性、同时支持应用到所有子目录和文件。

    AMFTP (FTP) v2.0.zip

    FTP上传管理工具 - AMFTP AMFTP - WEB FTP管理客户端 ...04) 压缩: Linux 环境全面支持 zip tar gzip(tar.gz) 格式解压与压缩。 05) 权限: 支持在线全面设置文件权限属性、同时支持应用到所有子目录和文件。

    java编程100例

    实例53 用GZIP压缩解压文件 实例54 用Zip压缩多个文件 实例55 从压缩包中提取文件 实例56 zip压缩包查看程序 实例57 压缩中文文件名的文件 实例58 存储与读取对象 实例59 Java画图程序 实例60 从网络取得图像 实例61...

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    iperf for linux Unix

    Iperf2 0 2目前仅提供源码包的下载 当你下载到Iperf源码包后 在类unix系统上 需要先解压缩源码包 使用解压缩命令gzip或tar 解压后会产生新文件夹“Iperf 2 0 2” Iperf2 0 2在以下操作系统中可以很好的被编译:Linux...

    java源码包2

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包3

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包4

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Tcp服务端与客户端的JAVA实例源代码 2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多...

Global site tag (gtag.js) - Google Analytics