在iPhone开发中实现解压缩gzip
在iPhone开发中实现解压缩gzip是本文要介绍的内容,最近做的一个东西中,需要从网络获取xml文件,但是该文件用了gzip压缩的。搜索一 下有人说gzip压缩的用urlrequest可以自己解压,但是这必须从服务器返回的header中有accept-Encoding说明是gzip 的。也就是用这句就可以实现自解压:
- [urlRequest addValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
 
这个在我的项目中没有作用,因为服务器返回的header中没有Accept-Encoding的说明。这就需要手动解压了!解压需要导入libz.1.2.3.dylib库,导入#import "zlib.h"
下面是解压的代码:
- -(NSData *)uncompressZippedData:(NSData *)compressedData
 - {
 - if ([compressedData length] == 0) return compressedData;
 - unsigned full_length = [compressedData length];
 - unsigned half_length = [compressedData length] / 2;
 - NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length];
 - BOOL done = NO;
 - int status;
 - z_stream strm;
 - strm.next_in = (Bytef *)[compressedData bytes];
 - strm.avail_in = [compressedData length];
 - strm.total_out = 0;
 - strm.zalloc = Z_NULL;
 - strm.zfree = Z_NULL;
 - if (inflateInit2(&strm, (15+32)) != Z_OK) return nil;
 - while (!done) {
 - // Make sure we have enough room and reset the lengths.
 - 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];
 - } else {
 - return nil;
 - }
 - }
 
小结:在iPhone开发中实现解压缩gzip的内容介绍完了,希望本文对你有所帮助!
在iPhone开发中实现解压缩gzip的更多相关文章
- iPhone开发中从一个视图跳到另一个视图有三种方法:
		
iPhone开发中从一个视图跳到另一个视图有三种方法: 1.self.view addSubView:view .self.window addSubView,需要注意的是,这个方法只是把页面加在 ...
 - iphone 开发中使用zbar时遇到的几个典型问题解决方法。
		
iphone 开发中使用zbar时遇到的几个典型问题解决方法. 在近期的一个ios项目中使用到了一个二维码扫描库(Qrcode)--ZBar, 期间遇到2个问题. 1. zbar下载后使用其l ...
 - iPhone开发中,关于视图跳转的总结(转)
		
iPhone开发中,关于视图跳转的总结 iPhone开发中从一个视图跳到另一个视图有三种方法: 1. self.view addSubView:view .self.window addSubView ...
 - iphone开发中调用系统打电话功能
		
iphone开发中调用打电话功能,一般有2种: 1.系统的打电话代码,不返回当前程序: Java代码 [[UIApplication sharedApplication] openURL:[NSURL ...
 - iPhone开发中的技巧整理
		
1.NSCalendar用法 -(NSString *) getWeek:(NSDate *)d { NSCalendar *calendar = [[NSCalendar alloc] initWi ...
 - iphone开发中数据持久化之——属性列表序列化(一)
		
数据持久化是应用程序开发过程中的一个基本问题,对应用程序中的数据进行持久化存储,有多重不同的形式.本系列文章将介绍在iphone开发过程中数据持久化的三种主要形式,分别是属性列表序列号.对象归档化以及 ...
 - iphone开发中使用nib(xib)文件的内存管理
		
iphoneuinavigationcontrollercocoauiviewvariableswindows 在使用nib文件做界面开发的过程中,加载nib文件后,由于设置了outlet和deleg ...
 - iphone开发中数据持久化之——嵌入式SQLite(三)
		
前两篇分别讨论了使用属性列表的数据持久化.使用对象归档的数据持久化,本文将讨论第三个实现数据持久化的方法---嵌入式SQL数据库SQLite3.SQLite3在存储和检索大量数据方面非常有效.它还能够 ...
 - iphone开发中数据持久化之——模型对象归档(二)
		
在Cocoa世界中,术语“归档”是指另一种形式的序列化,它可以实现对任何对象的序列化.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文件,然后再从中读取它们.只要在类中实现的每个属性都是标量(如 ...
 
随机推荐
- mysql数据库基本操作sql语言
			
mysql的启动与关闭 启动 /etc/init.d/mysql start 多实例使用自建脚本启动 2种关闭数据库方法 mysqladmin -uroot -p密码 shutdown #优雅关闭/e ...
 - Zabbix - 配置服务器对第三方服务的监控
			
需求: 需要配置zabbix监控,使得zabbix服务器可以监控到另一台服务器上运行的第三方服务的状态,当状态异常时发送告警邮件. 限制:被监控的服务器不允许安装任意客户端,且该台服务器不能联通外网 ...
 - Card 卡片
			
将信息聚合在卡片容器中展示. 基础用法 包含标题,内容和操作. Card 组件包括header和body部分,header部分需要有显式具名 slot 分发,同时也是可选的. <el-card ...
 - Tooltip 文字提示
			
常用于展示鼠标 hover 时的提示信息. 基础用法 在这里我们提供 9 种不同方向的展示方式,可以通过以下完整示例来理解,选择你要的效果. 使用content属性来决定hover时的提示信息.由pl ...
 - Redis常见报错之 Redis::CommandError (MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk)
			
在Redis运行过程中,报错信息如下: Redis::CommandError (MISCONF Redis is configured to save RDB snapshots, but it i ...
 - 初探ASP.NET Web API (转)
			
http://www.cnblogs.com/mejoy/p/6402821.html 什么是ASP.NET Web API? 官方的解释是 ASP.NET Web API is a framewor ...
 - split 使用
			
split作用:把字符串变成列表,这个字符串必须是多行文字.如果是单行文字或一个单词是不行的,实例操作如下: In [46]: output=subprocess.check_output(['df' ...
 - python-Web-数据库-Redis
			
概述: >>>安装: >>>数据类型: string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) &g ...
 - Django 邮箱找回密码!!!!!!!!!!!!!!!!
			
1.大概流程. @首先在完善登陆页面,增加忘记密码的链接. @为了账户安全,需要对操作者进行验证,向邮箱发随机数验证! @在重置验证码页面,验证验证码是否匹配(验证成功跳转至更改密码也页面). @ 重 ...
 - Leetcode之动态规划(DP)专题-877. 石子游戏(Stone Game)
			
Leetcode之动态规划(DP)专题-877. 石子游戏(Stone Game) 亚历克斯和李用几堆石子在做游戏.偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] . 游戏以谁手中的石子最 ...