2011-12-08 2 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); 
} 

だから、かなり私は解凍段階にしかし、私はこのデータを解凍するために使用する必要がどの関数/メソッドなどを確認していませんよ。私はASIラッパーがすべてを処理するので比較的簡単なgzipでこれを試したことがあります。

は、しかし原因私のコントロール外の状況に、私は今取得していますデータは、あなたがそれについて私に言うことができる任意の関数、メソッドまたは例が私の原因がいただければ幸いに役立つzlibのエンコード...です。

編集:

が@Caleb応答から今後私は を追加したが、私のファイルに「zlib.hの」を含んで、今、これはメソッドをフレームワークへのアクセス権を持っています。そのうちの1つはinflate()メソッドです。しかし、どのパラメータを入力する必要があるのか​​よくわかりません。何か案は?。

答えて

3

zlibのWebサイトでthe exampleを見たことがありますか? inflateInit()inflate()、およびinflateEnd()は(ほとんど)必要なすべてのように見えます。

あなたは-requestFinished:方法の例から教訓を適用することをお勧めします。つまり、最初にすべての圧縮データをダウンロードしてから、圧縮解除を試みます。ダウンロード時に圧縮解除することはおそらく可能ですが、それはもっと役立たずにもっと複雑になります。

更新:あなたのフォローアップの質問に答えるために、あなたはinflate()に合格する必要がある2つのパラメータは、(あなたがinflateInit()を使用して、以前に初期化されています)z_streamとフラッシュオプションです。この例ではZ_NO_FLUSHを使用しています。他のオプションがどれだけ可能か調べるにはちょっとお読みください。

私のアドバイスは、例のinf()の機能を、散在しているすべての説明テキストを除いてコードに貼り付けることです。次に、それをあなたのNSDataから読み込むように変換し、おそらくNSInputStreamとNSOutputStreamを使用してNSMutableDataに書き込みます。これは、圧縮データを含むNSDataを渡すことができ、非圧縮データを含むNSMutableDataを返す関数を提供します。あなたは、単に書くことができ、これを使用してhttp://www.cocoadev.com/index.pl?NSDataCategory

+0

はい、私はそれを見ましたが、私はC++の例を見ていたと思った、これは私がやっている何で動作するように取得するかどうかはわかりませんでした。 #include "zlib.h"を追加するだけで、NSDataオブジェクトのinFlateを呼び出すことができます。 –

+0

Cool、私はちょうど今、どのパラメータがinflate(__、__)にエネルされるべきかを把握しています。 –

+1

例は普通のCです。注釈が多すぎますので、何度か読んで理解してくださいそれが最初に。この例の 'inf()'関数はファイルを読み書きします。あなたのNSDataから読み込み、あなたが提供するNSMutableDataに書き込むためにそれを適応させたいでしょう。 'fread()'と 'fwrite()'の呼び出しをNS [Mutable] Dataの呼び出しで置き換えるのは難しくありませんが、NSInputStreamとNSOutputStreamを使ってもっと簡単にすることができます。概念的には、NS [Input | Output] Streamは、FILE *と同じように動作します。連続して読み書きするバッファだけです。 – Caleb

1

このNSDataのカテゴリをチェックしてください。

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

これを朝にテストしよう!私はそれを試していただきありがとうございます非常に感謝!もう一度このヒープに感謝します。 –

+0

私はちょうどそれを正しく読んでいるだけで、2つのエントリを見つけました - zlibのためのdeflateメソッドを追加しました。完全にテストされているわけではありません。おそらく小さなデータブロックに最適です。フィードバック/コードレビュー/改善/などを感謝します。 -Seb gzip inflate/deflateの完全サポートが追加されました。ほとんどの場合、zlibメソッドのコピーで、gzipのウィンドウサイズが適切に変更されます。 このライブラリが更新された最後の時間は2009年に戻ったので、これを使うべきかどうかはわかりません...私は読書などを続け、すぐに決めます。 –

+1

リンクが死んだ...... – jjxtra