解压缩zlib编码的nsdata

时间:2011-12-08 22:02:38

标签: iphone ios asihttprequest zlib

我正在尝试使用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()方法..但是我不确定需要输入哪些参数?有任何想法吗?。 enter image description here

3 个答案:

答案 0 :(得分:3)

您是否在zlib网站上查看了the exampleinflateInit()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的一个很好的例子。非常清晰简洁。不需要第三方图书馆。