Распаковать закодированные в zlib nsdata

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

Редактировать:

Двигаясь вперед от ответа @Caleb, я добавил в свой файл include «zlib.h» и теперь имею доступ к этим методам фреймворка. Одним из них является метод inflate(). Однако я не уверен, какие параметры нужно ввести в него? Любые идеи?. введите здесь описание изображения


person C.Johns    schedule 08.12.2011    source источник


Ответы (3)


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

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

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

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

person Caleb    schedule 08.12.2011
comment
Да, я видел это, но я думал, что смотрю на пример C++ и не знаю, как заставить его работать с тем, что я делаю. Просто мне просто нужно добавить #include zlib.h, тогда я смогу вызвать inFlate для своего объекта NSData? - person C.Johns; 09.12.2011
comment
Круто, я просто пытаюсь выяснить, какие параметры должны быть введены в inflate (__, __) - person C.Johns; 09.12.2011
comment
Пример написан на старом добром C. Он сильно аннотирован, так что прочтите его несколько раз и сначала убедитесь, что вы его поняли. Функция inf() в примере читает и записывает из/в файлы; вы, вероятно, захотите адаптировать его для чтения из вашего NSData и записи в предоставленный вами NSMutableData. Нетрудно заменить вызовы fread() и fwrite() вызовами NS[Mutable]Data, но вы можете использовать NSInputStream и NSOutputStream, чтобы упростить задачу. Концептуально NS[Input|Output]Stream работает во многом подобно FILE* — просто буферы, которые вы читаете или записываете последовательно. - person Caleb; 09.12.2011
comment
Круто, спасибо за всю помощь, чувак. Думаю, это может быть немного за пределами моего текущего набора навыков. Буду продолжать читать пример и надеяться на лучшее. - person C.Johns; 09.12.2011


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

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

person techsMex    schedule 17.02.2014