Распаковать zlb закодированные nsdata - PullRequest
1 голос
/ 09 декабря 2011

Я пытаюсь распаковать некоторые zlib-закодированные данные, которые я загружаю с помощью оболочки ASIHTTPRequest.

Это то, что у меня есть до сих пор ... в основном, просто ввод данных, и теперь я надеялся на некоторую помощь, чтобы начать процесс распаковки.

- (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. Так что любые функции, методы или примеры, о которых вы можете рассказать мне, помогут моей цели.

Edit:

Переход от ответа @Caleb, который я добавил включите "zlib.h" в мой файл и получите доступ к методам этого фреймворка. Одним из них является метод inflate (). Однако я не уверен, какие параметры необходимо ввести в него? есть идеи?. enter image description here

Ответы [ 3 ]

3 голосов
/ 09 декабря 2011

Вы видели пример на веб-сайте zlib?inflateInit(), inflate() и inflateEnd() выглядят (почти) все, что вам нужно.

Вы захотите применить урок из примера в своем методе -requestFinished:.Другими словами, вы сначала загрузите все сжатые данные и только потом попытаетесь распаковать их.Возможно, можно распаковать при загрузке, но это будет сложнее, если не будет более полезным.

Обновление: Чтобы ответить на ваш дополнительный вопрос, два параметра, которые вам нужно передатьв inflate() находятся z_stream (который вы инициализировали ранее с помощью inflateInit()) и опция сброса.В примере используется Z_NO_FLUSH - вам придется немного прочитать, чтобы узнать, какие другие варианты возможны.

Мой совет - взять из примера функцию inf(), за исключением всего разбросанного пояснительного текста,и вставьте его в свой код.Затем преобразуйте его для чтения из ваших NSData и записи в NSMutableData, возможно, используя NSInputStream и NSOutputStream, как предложено в моем комментарии ниже.Это должно дать вам функцию, в которую вы можете передать NSData, содержащую сжатые данные, и которая будет возвращать NSMutableData, содержащую несжатые данные.

1 голос
/ 09 декабря 2011

Проверьте эту категорию NSData: http://www.cocoadev.com/index.pl?NSDataCategory

Используя это, вы можете просто написать:

   uncompressedResponseData = [[request responseData] zlibInflate]; 
0 голосов
/ 18 февраля 2014

См. http://iosdeveloperzone.com/2013/03/14/code-snippet-decompressing-a-gzipped-buffer/

Это отличный пример zlib.h для iOS. Очень ясно и кратко. Библиотека сторонних производителей не требуется.

...