2011-12-08 80 views
1

我想解压一些zlib编码数据,我使用ASIHTTPRequest包装器下载。解压缩zlib编码nsdata

这是我迄今为止..拦着的数据,现在我希望一些帮助,开始解压过程。

- (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()方法..但是我不确定需要输入什么参数?有任何想法吗?。 enter image description here

回答

3

你在zlib网站上看过the example吗? inflateInit(),inflate()inflateEnd()看起来像(几乎)所有你需要的。

你想申请从例子中的教训你-requestFinished:方法。换句话说,你将首先下载所有的压缩数据,然后尝试解压缩它。您可能会在下载时解压缩,但这会变得更复杂,而不会更有帮助。

更新:要回答你的后续问题,你需要传递到inflate()的两个参数是z_stream(你将以前使用inflateInit()已初始化)和刷新选项。该示例使用Z_NO_FLUSH - 您必须阅读一下才能找出其他可能的选项。

我的建议是从示例中取inf()函数,减去所有散布的说明文本,然后将其粘贴到代码中。接下来,将其转换为从您的NSData读取并写入NSMutableData,可能使用NSInputStream和NSOutputStream,如我在下面的评论中所建议的。这应该给你一个函数,你可以传递一个NSData包含压缩数据,并将返回一个包含未压缩数据的NSMutableData。

+0

是的,我看到了,但我认为我正在看一个C++的例子,不知道如何得到这个与我正在做的工作。只需要添加#include“zlib.h”,然后我可以在我的NSData对象上调用inFlate? –

+0

很酷,我只是想弄清楚什么样的参数应该被用于膨胀(__,__) –

+1

这个例子是在普通的老C中。它有很多注释,所以通读它几次,并确保你明白它首先。示例中的'inf()'函数读写文件;你可能会想调整它来读取你的NSData并写入你提供的NSMutableData。用调用NS [Mutable] Data来替换'fread()'和'fwrite()'并不难,但是你可能想要使用NSInputStream和NSOutputStream来使事情变得更容易。从概念上讲,NS [输入|输出]流的工作方式与FILE *很相似 - 只是按顺序读取或写入的缓冲区。 – Caleb

1

看看这个NSData的类别:http://www.cocoadev.com/index.pl?NSDataCategory

使用这个可以简单的写:

uncompressedResponseData = [[request responseData] zlibInflate]; 
+0

要在早上测试!非常感谢,一旦我测试了它就会标志!再次感谢这堆。 –

+0

即时阅读,虽然它现在正确,并已发现两个条目 - 添加deflate方法zlib;作品但未经彻底测试;可能最适合小块数据。希望反馈/代码审查/改进/等。 -Seb 新增完全支持gzip充气/放气。大部分是zlib方法的副本,gzip的适当窗口大小发生了变化。 和这个图书馆最后一次更新是在2009年,所以不知道我是否应该使用这个或不...我会继续阅读等,并尽快决定。 –

+1

链接死了...... – jjxtra