iPhone开发中实现解压gzip是本文要介绍的内容,最近做的一个东西中,需要从网络获取xml文件,但是该文件用了gzip压缩的。搜索一 下有人说gzip压缩的用urlrequest可以自己解压,但是这必须从服务器返回的header中有accept-Encoding说明是gzip 的。也就是用这句就可以实现自解压

  1. [urlRequest addValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];

这个在我的项目中没有作用,因为服务器返回的header中没有Accept-Encoding的说明。这就需要手动解压了!解压需要导入libz.1.2.3.dylib库,导入#import "zlib.h"

下面是解压的代码:

  1. -(NSData *)uncompressZippedData:(NSData *)compressedData
  2. {
  3. if ([compressedData length] == 0) return compressedData;
  4. unsigned full_length = [compressedData length];
  5. unsigned half_length = [compressedData length] / 2;
  6. NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length];
  7. BOOL done = NO;
  8. int status;
  9. z_stream strm;
  10. strm.next_in = (Bytef *)[compressedData bytes];
  11. strm.avail_in = [compressedData length];
  12. strm.total_out = 0;
  13. strm.zalloc = Z_NULL;
  14. strm.zfree = Z_NULL;
  15. if (inflateInit2(&strm, (15+32)) != Z_OK) return nil;
  16. while (!done) {
  17. // Make sure we have enough room and reset the lengths.
  18. if (strm.total_out >= [decompressed length]) {
  19. [decompressed increaseLengthBy: half_length];
  20. }
  21. strm.next_out = [decompressed mutableBytes] + strm.total_out;
  22. strm.avail_out = [decompressed length] - strm.total_out;
  23. // Inflate another chunk.
  24. status = inflate (&strm, Z_SYNC_FLUSH);
  25. if (status == Z_STREAM_END) {
  26. done = YES;
  27. } else if (status != Z_OK) {
  28. break;
  29. }
  30. }
  31. if (inflateEnd (&strm) != Z_OK) return nil;
  32. // Set real length.
  33. if (done) {
  34. [decompressed setLength: strm.total_out];
  35. return [NSData dataWithData: decompressed];
  36. } else {
  37. return nil;
  38. }
  39. }

小结:在iPhone开发中实现解压缩gzip的内容介绍完了,希望本文对你有所帮助!

在iPhone开发中实现解压缩gzip的更多相关文章

  1. iPhone开发中从一个视图跳到另一个视图有三种方法:

    iPhone开发中从一个视图跳到另一个视图有三种方法:   1.self.view addSubView:view .self.window addSubView,需要注意的是,这个方法只是把页面加在 ...

  2. iphone 开发中使用zbar时遇到的几个典型问题解决方法。

    iphone 开发中使用zbar时遇到的几个典型问题解决方法.   在近期的一个ios项目中使用到了一个二维码扫描库(Qrcode)--ZBar, 期间遇到2个问题.   1. zbar下载后使用其l ...

  3. iPhone开发中,关于视图跳转的总结(转)

    iPhone开发中,关于视图跳转的总结 iPhone开发中从一个视图跳到另一个视图有三种方法: 1. self.view addSubView:view .self.window addSubView ...

  4. iphone开发中调用系统打电话功能

    iphone开发中调用打电话功能,一般有2种: 1.系统的打电话代码,不返回当前程序: Java代码 [[UIApplication sharedApplication] openURL:[NSURL ...

  5. iPhone开发中的技巧整理

    1.NSCalendar用法 -(NSString *) getWeek:(NSDate *)d { NSCalendar *calendar = [[NSCalendar alloc] initWi ...

  6. iphone开发中数据持久化之——属性列表序列化(一)

    数据持久化是应用程序开发过程中的一个基本问题,对应用程序中的数据进行持久化存储,有多重不同的形式.本系列文章将介绍在iphone开发过程中数据持久化的三种主要形式,分别是属性列表序列号.对象归档化以及 ...

  7. iphone开发中使用nib(xib)文件的内存管理

    iphoneuinavigationcontrollercocoauiviewvariableswindows 在使用nib文件做界面开发的过程中,加载nib文件后,由于设置了outlet和deleg ...

  8. iphone开发中数据持久化之——嵌入式SQLite(三)

    前两篇分别讨论了使用属性列表的数据持久化.使用对象归档的数据持久化,本文将讨论第三个实现数据持久化的方法---嵌入式SQL数据库SQLite3.SQLite3在存储和检索大量数据方面非常有效.它还能够 ...

  9. iphone开发中数据持久化之——模型对象归档(二)

    在Cocoa世界中,术语“归档”是指另一种形式的序列化,它可以实现对任何对象的序列化.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文件,然后再从中读取它们.只要在类中实现的每个属性都是标量(如 ...

随机推荐

  1. C++中的各种容器实现原理

    C++ 容器及选用总结 vector 拥有一段连续的内存空间 list 就是数据结构中的双向链表 deque 的动态数组首尾都开放 set 有序的容器,红黑树的平衡二叉检索树的数据结构 multise ...

  2. JDBC接口核心的API

    java.sql.*   和  javax.sql.* Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口. |- connect(url, properties):  ...

  3. FTP\SFTP连接命令

    五.ftp连接     输入:ftp 10.18.49.19 2121六.输入账号密码  zhangsan/sdjg34t#七.输入:ls    查看文件是否上传       如上传 输入:bye   ...

  4. RESTful 介绍

    什么是RESTful?一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务端交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. ...

  5. 获取sql server中自增量之scope_identity(),@@Identity,IDENT_CURRENT的区别

    http://www.lmwlove.com/ac/ID480 在sql server2005,如果要获某个表最新增加的自增量,我们都知道,可以使用COPE_IDENTITY. IDENT_CURRE ...

  6. Jquery(DOM和选择器)

    O(∩_∩)O~~~,今天简单整理了一下最近所学的Jquery知识.下面就总结一下. 首先,对于Jquery我们需要简单了解下: 1.Jquery是开放源代码的JS库, 2.Jquery操作是函数式编 ...

  7. 3-2 LInux文件管理

    LInux文件管理 文件系统目录结构 Linux中目录结构是有一定的约定的FHS /bin:存放二进制程序 /boot:启动相关 /dev:设备文件 /etc:配置文件 /home:用户家目录 /li ...

  8. CTF—攻防练习之HTTP—SQL注入(SSI注入)

    主机:192.168.32.152 靶机:192.168.32.161 ssI是赋予html静态页面的动态效果,通过ssi执行命令,返回对应的结果,若在网站目录中发现了.stm .shtm .shtm ...

  9. API接口设计的五大公共参数

    1.平台参数 2.操作系统参数 iOS.Android.PC等等 3.软件版本参数 4.udid号(设备唯一ID) 每个设备都会有一个唯一udid 5.渠道号 app软件从那个渠道下载

  10. 安装 Git 并连接 Github

    下载安装 Git, 下载地址:https://git-scm.com/download/win . 在命令行中输入 git 测试 Git 是否安装成功. 在桌面鼠标右击打开 Git Bash Here ...