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. [go]go环境安装-解决安装包不能访问golang.org问题

    安装go和vscode vscode插件列表选择go,安装即可,其他插件暂不安装 手动安装一些vscode配套的调试工具等 直接vscode-go,然后点下面的go-tools就能找到 go get ...

  2. 时间总线框架之EvenBus

    概述 EventBus定义:是一个发布 / 订阅的事件总线. 这么说应该包含4个成分:发布者,订阅者,事件,总线. 那么这四者的关系是什么呢? 很明显:订阅者订阅事件到总线,发送者发布事件. 订阅者可 ...

  3. Utf8 与 Utf8-BOM 的差异

    1.先说差异,Utf8-BOM编码的字符串比Utf8编码的字符串,多了前缀\xEF\xBF\xBD,肉眼是看不出来的,解析出来的字符串的长度也正常 比如:"123456",Enco ...

  4. layui弹出层处理(获取、操作弹出层数据等)

    要点: 字符串被渲染为弹窗层之后,回自动转换为DOM,可以使用jq进行各种操作 <!DOCTYPE html> <html> <head> <meta cha ...

  5. 美化Eclipse-背景

    为了美化Eclipse,请登录主题网站http://www.eclipsecolorthemes.org/ 下载EPF配置文件(截图如下),并导入eclispe即可. 导入方法: (1)从File菜单 ...

  6. c# 匿名类型获取值

    代码片段: 读取 new{ ....} 方法1:转换为json对象 dynamic model = SaleOrderServices.GetGiftOrderById(WebHelper.GetQu ...

  7. SQL学习(七)试图

    试图是基于SQL语句的结果集的可视化表. 1.创建试图 create view 试图名 as select 语句 如: create view ticketresult as select * fro ...

  8. IDEA的version control log为空,该怎么办?

    问题描述: 解决方案: 关掉IDEA,重新打开,即可药到病除

  9. js Date格式转化

    Date格式转化为日期  年-月-日(格式随意修改) GetDateStr(dd, AddDayCount) { dd.setDate(dd.getDate() + AddDayCount)// 获取 ...

  10. Python:Base2(List和Tuple类型, 条件判断和循环,Dict和Set类型)

    1.Python创建list: Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: &g ...