2011-12-08 190 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