`

[转]客户端的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静态解压

    虽然浏览器默认处理GZIP解压,但有时我们可能需要在JavaScript中手动处理解压,例如在处理服务端返回的压缩数据时。这需要用到一些库,如`pako`,这是一个JavaScript实现的GZIP/DEFLATE库,可以方便地进行压缩和解...

    web的gzip解压代码

    在Web开发中,为了提高页面加载速度和减少网络传输的数据量,经常采用GZIP压缩技术。...在本主题中,我们将深入探讨如何在Web...了解如何在客户端和服务器端进行GZIP解压,可以帮助我们更好地利用网络资源,提高应用性能。

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

    客户端的FLASH(现在通常被HTML5取代)负责接收服务器发送的GZIP压缩数据,并在本地进行解压缩,以便正确解析和展示游戏内容。 **JavaScript GZIP压缩和解压缩的实现** 1. **压缩过程**:在JavaScript中,我们可以...

    使用libcurl获取经过gzip压缩的网页文件

    在互联网通信中,为了减少数据传输量,提升网络性能,许多服务器会将网页内容通过gzip进行压缩后再发送给客户端。libcurl是一个强大的URL传输库,它支持多种协议,包括HTTP,能够处理经gzip压缩的数据。本文将深入...

    一个Gzip场景下帮助渗透测试的Burp插件,会对Gzip数据进行各种处理 (一般用于富客户端渗透测试).zip

    一个Gzip场景下帮助渗透测试的Burp插件,会对Gzip数据进行各种处理 (一般用于富客户端渗透测试)Burp-Gzip进程一个Gzip场景下帮助渗透测试的Burp插件,会对Gzip...decode.jar 加载后对所有获取的数据包body做Gzip解压。

    VC6 gzip 压缩解压 测试代码 使用gzip.dll

    在本文中,我们将深入探讨如何在Visual C++ 6(简称VC6)环境中使用gzip库进行数据的压缩和解压。gzip是一种广泛应用于网络数据传输的压缩格式,它基于Deflate算法,能够有效地减小文件大小,从而提高传输效率。...

    ajax+pako.js实现gzip数据压缩上传,解决post数据过长问题

    这通常涉及到读取请求中的二进制数据,然后使用相应的gzip解压库(如Node.js中的`zlib`模块)进行解压,再进一步处理解压后的内容。 6. **安全性和性能考虑**:虽然gzip压缩可以显著减少数据传输量,但也增加了计算...

    zlib解压http的gzip数据

    在客户端接收到压缩过的响应体后,需要使用相应的解压算法来还原原始数据。`zlib`库是处理gzip压缩格式的一种常用工具,它提供了一系列API用于数据的压缩和解压。 #### zlib库简介 `zlib`是一个跨平台的数据压缩库...

    http.rar_C http_gzip_gzip http_http gzip_socket gz

    在客户端,可能涉及解析HTTP响应头来检测Content-Encoding字段,并使用相应的解压方法(如gzip库)解压缩接收到的数据。 socket__gz标签提到了socket编程和gzip的结合。在TCP/IP编程中,socket是操作系统提供的接口...

    linux校园网客户端

    tar是一个强大的归档和压缩工具,常用命令格式是`tar -zxvf 文件名.tar.gz`,这里的"-z"表示解压gzip格式的文件,"-x"表示解压,"-v"表示详细模式,"-f"后面接的是要解压的文件名。 解压后,你可能会发现以下文件和...

    gzip 压缩 三种方法

    - **浏览器兼容性**:并非所有浏览器都支持gzip压缩,因此在启用gzip之前,应先检测客户端是否接受gzip编码,可以通过检查`Accept-Encoding`头部来实现。 - **性能影响**:虽然gzip能显著减小传输数据量,但也会...

    基于pako.js实现gzip的压缩和解压功能示例

    这个示例展示了如何在浏览器环境中使用pako.js进行gzip压缩和解压,这对于需要在客户端处理大量数据或者需要减小数据传输量的场景非常有用。同时,它也展示了如何将压缩和解压集成到实际的Web应用程序中,使得用户...

    Gzip工具打包JS、CSS文件,后台解压缩

    当浏览器发送请求时,如果服务器支持Gzip,它就会对响应内容进行Gzip压缩,然后发送到客户端。 **Gzip打包JS、CSS文件** 1. **命令行压缩**:在Unix/Linux系统中,你可以使用`gzip`命令来压缩单个文件或目录。例如...

    gzip java ajax

    当服务器向浏览器发送响应时,如果支持gzip压缩,服务器会先将数据进行gzip压缩,然后发送到客户端。客户端(通常是现代浏览器)接收到压缩数据后,会自动解压并处理。这样,即使在网络环境较差的情况下,也能实现...

    gzip.dll 网页数据压缩解压用

    gzip 函数库为 Web 服务器和客户端提供了数据压缩的功能,从而显著减少了网络带宽的使用,加快了网页加载速度。 **gzip 压缩算法:** gzip 是基于 DEFLATE 压缩算法的,DEFLATE 结合了 LZ77(Lempel-Ziv)算法和...

    volley网络请求源码,添加gzip数据格式

    在HTTP协议中,服务器可以通过设置`Content-Encoding: gzip`响应头来告知客户端数据是以gzip压缩的。 为了让Volley支持gzip,我们需要在接收到服务器响应时检测`Content-Encoding`头,并根据需要对数据进行解压。这...

    VBS获取GZIP压缩的HTTP内容的实现代码

    实现VBS中的GZIP解压通常涉及到解析GZIP头信息、执行Deflate算法(GZIP内核)以及处理CRC校验。这需要对GZIP格式和压缩算法有深入的理解,并且实现起来可能比使用成熟组件更复杂、效率更低。 总结来说,VBS处理GZIP...

    Java用GZIP压缩解压文件.zip

    服务器和客户端可以通过协商是否启用GZIP压缩。 总之,Java中的GZIP API提供了方便的工具来处理文件的压缩和解压缩。了解如何使用这些工具对于任何Java开发者来说都是一项重要的技能,尤其是在处理大量数据或优化...

    netty对象传输gzipdemo

    在Netty中,可以使用`GzipHandler`来实现gzip压缩和解压。当数据通过`GzipHandler`时,它会自动对数据进行压缩,然后在网络上传输,接收端则进行解压,恢复原始数据。 实现“netty对象传输gzipdemo”的步骤大致如下...

    Gzip压缩.docx

    3. 客户端接收到带有`Content-Encoding: gzip`头的响应后,会自动解压内容并正常渲染页面。 对于IIS 6.0服务器启用Gzip压缩的步骤如下: 1. 打开IIS管理器,右键点击“网站”选择“属性”,在“服务”选项卡中勾选...

Global site tag (gtag.js) - Google Analytics