我正在尝试使用ASIHTTPRequest包装器解压缩我正在下载的一些zlib编码数据。
这就是我到目前为止所做的...几乎只是获取数据,现在我希望得到一些帮助来启动解压缩过程。
- (IBAction)sendHttpsRequest
{
//Set request address
NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"https://192.168.17.36:443"];
//call ASIHTTP delegates (Used to connect to database)
NSURL *url = [NSURL URLWithString:databaseURL];
//This sets up all other request
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setDelegate:self];
[request setValidatesSecureCertificate:NO];
[request setPostValue:@"ClientDataSet.xml" forKey:@"filename"];
[request startSynchronous];
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
responseData = [request responseData]; //Pass requested data from server over to NSData variable..
//Is this where I have to think about decompression? or do I pass this data out to another method?
}
- (void)requestFailed:(ASIHTTPRequest *)request
{
self.hudCheck = NO;
[NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(stopAnimating) userInfo:nil repeats:NO];
NSError *error = [request error];
NSLog(@"%@", error);
}
所以我非常依赖于解压缩阶段但是我不确定我需要使用哪些函数/方法来解压缩这些数据。我只用gzip试过这个,因为ASI包装器自己处理所有东西,所以相对容易。
然而,由于我无法控制的情况,我现在得到的数据是zlib编码..所以你能告诉我的任何函数,方法或例子都会对我的事业有所帮助。
编辑:
从@Caleb回复中我已经添加了 在我的文件中包含“zlib.h”,现在可以访问这些框架方法。其中一个是inflate()方法..但是我不确定需要输入哪些参数?有任何想法吗?。
答案 0 :(得分:3)
您是否在zlib网站上查看了the example? inflateInit()
,inflate()
和inflateEnd()
看起来(几乎)只需要你。
您需要在-requestFinished:
方法中应用示例中的课程。换句话说,您将首先下载所有压缩数据,然后尝试解压缩。在下载时可能会解压缩,但这样会更复杂而不会更有帮助。
更新:要回答您的后续问题,您需要传递到inflate()
的两个参数是z_stream(您之前将使用inflateInit()
初始化该参数)和一个冲洗选项。该示例使用Z_NO_FLUSH - 您必须阅读一些内容以找出可能的其他选项。
我的建议是从示例中取出inf()
函数,减去所有散布的解释性文本,然后将其粘贴到代码中。接下来,将其转换为从NSData读取并写入NSMutableData,可能使用NSInputStream和NSOutputStream,如下面的评论中所建议的那样。这应该为您提供一个函数,您可以传递包含压缩数据的NSData,并返回包含未压缩数据的NSMutableData。
答案 1 :(得分:1)
查看此NSData类别:http://www.cocoadev.com/index.pl?NSDataCategory
使用此功能,您只需编写:
uncompressedResponseData = [[request responseData] zlibInflate];
答案 2 :(得分:0)
请参阅http://iosdeveloperzone.com/2013/03/14/code-snippet-decompressing-a-gzipped-buffer/
这是适用于iOS的zlib.h的一个很好的例子。非常清晰简洁。不需要第三方图书馆。