服务端使用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就可以了。

客户端的gzip解压相关推荐

  1. HTML中chunked解码和gzip解压

    chunked编码 chunked编码的的好处 当访问的时动态页面时,服务器则无法预知内容的大小,因此需要一遍产生数据,一边发送数据,将数据分块发送(服务器通过响应头'Transfer-Encodin ...

  2. httplib 和 httplib2区别之 gzip解压

    HTTP请求头Accept-encoding: gzip信息告诉服务器,如果它有任何新数据要发送给时,请以压缩的格式发送.如果服务器支持压缩,它将返回由 gzip 压缩的数据并且使用Content-e ...

  3. 将多个文件压缩成gzip,将gzip解压成多个文件

          第一步:文件压缩和解压缩方法 //解压gzip文件public static boolean extractZip(File file, File parent) {ZipFile zf ...

  4. linux gzip 解压 函数,获取http的gzip内容,并解压

    问题: 入问题,问题答案立即呈现在您眼前! 寻找gzip 获取一个网页数据返回的编码类型是gzip,我该怎么解压缩 HTTP头获取? 如何用vb获取网络上的xml文件,并解析内容 关于GZIP的解码 ...

  5. gzip 解压_简简单单_百度空间

    gzip 解压_简简单单_百度空间 gzip 解压_简简单单_百度空间 问题: 入问题,问题答案立即呈现在您眼前! gzip格式rfc 1952 http://www.ietf.org/rfc/rfc ...

  6. asp.net实现GZip压缩和GZip解压

    最近在开发一个网站doc.115sou.com,使用到了GZip压缩技术,经过多次搜索找到asp.net中用GZip对数据压缩和解压缩非常方便,当我第一次拿到这个类的时候却感觉很迷茫,无从下手.主要是 ...

  7. java gzip 解压文件_Java实现文件压缩与解压[zip格式,gzip格式]

    原文:http://www.cnblogs.com/visec479/p/4112881.html#3069573 Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个 ...

  8. gzip解压str python_有哪些你不知道的Python小工具

    ython作为越来越流行的一种编程语言,不仅仅是因为它语言简单,有许多现成的包可以直接调用. python中还有大量的小工具,让你的python工作更有效率. 1. 快速共享 HTTP服务器 Simp ...

  9. 文件流,gzip解压,压缩

    目录 文件画布 写入 (空文件 Fout=new File(Parent,entry.getName());) FileOutputStream out=new FileOutputStream(Fo ...

  10. 基于pako的gzip解压

    let strData = atob(res.data) let charData = strData.split('').map(function (x) { return x.charCodeAt ...

最新文章

  1. python基础练习(五)
  2. interface declaration, parcelable declaration, AidlTokenType.import or AidlTokenType.package ...
  3. 光伏电站清扫机器人_光伏智能清扫机器人
  4. java验证码的实现
  5. 快速傅里叶变换python_【原创】OpenCV-Python系列之傅里叶变换(三十八)
  6. JDK8新特性之重复注解
  7. JavaBean 持久化
  8. shell与其他语言不同点
  9. nlp 停用词处理java_NLP入门:文本预处理(一)停用词
  10. ckeditor 3.6一直提示“例外被抛出且未被接住”的问题的解决方法
  11. linux学习笔记3——计算机概述:主板、电源、数据表示方式、编码集
  12. 电磁流量计流速信号特征
  13. YOLOv5、v7改进之三十九:引入改进遮挡检测的Tri-Layer插件 | BMVC 2022
  14. 28个Java开发常用规范技巧总结
  15. Postman发送带cookie的http请求
  16. iCloud云上贵州,2018数博会连接2亿多用户
  17. 体育生学编程——html学习
  18. 面试时如何考察应聘者的素质?
  19. 以业务改进为目标的流程优化方法
  20. 红旗linux 操作系统,红旗Linux操作系统9.0官方下载-红旗Linux操作系统9.0正式版(基于c语言)免费版 - 维维软件园...

热门文章

  1. 沧小海基于xilinx srio核的学习笔记之第四章 Xilinx SRIO的示例分析(二)
  2. 计算机类专业本科学生成长四阶段必读四本书推荐
  3. 获取中国各省市区县经纬度的方法
  4. SI4463的数据冲撞解决办法
  5. 软件设计模式与体系结构 期末课后题
  6. Kali 暴力破解wifi密码
  7. CSP202104-4 校门外的树
  8. Xshell6 + Xftp6 绿色破解
  9. 电子板书:Word,PPT,PDF手写批注很轻松
  10. python等额本息和等额本金_房贷利率有没有套路?这是我见过最透彻的Python版解读!...