У меня есть веб-сервис, работающий на Windows Azure, который возвращает JSON, который я использую в своем приложении для iPhone.
К сожалению, Windows Azure, кажется еще, не поддерживает сжатие динамических ответов (длинная история), таким образом, я решил обойти его путем возврата несжатого пакета JSON, который содержит сжатое (использующий GZIP) строка.
например,
{"Error":null,"IsCompressed":true,"Success":true,"Value":"vWsAAB+LCAAAAAAAB..etc.."}
... где значение является сжатой строкой сложного объекта, представленного в JSON.
Это было действительно легко реализовать на сервере, но ни за что в жизни я не могу выяснить, как распаковать gzipped NSString в несжатый NSString, все примеры, которые я могу найти для zlib и т.д., имеют дело с файлами и т.д.
Кто-либо может дать мне какой-либо ключ к разгадке о том, как сделать это? (Я также был бы счастлив за решение, которое использовало, выкачивают, поскольку я мог измениться, реализация серверной стороны для использования выкачивают также).
Спасибо!!
Steven
Редактирование 1: Aaah, я вижу, что ASIHTTPRequest использует следующую функцию в, он - исходный код:
//uncompress gzipped data with zlib
+ (NSData *)uncompressZippedData:(NSData*)compressedData;
... и я знаю, что могу преобразовать NSString в NSData, таким образом, я буду видеть, приводит ли это меня куда-нибудь!
Редактирование 2: К сожалению, метод, описанный в Редактировании 1, не привел меня никуда.
Редактирование 3: Следуя совету ниже оценки base64 кодирование/декодирование, я придумал следующий код. encodedGzippedString - как можно предположить, строка "Привет, моим именем является Steven Elliott", который является gzipped и затем преобразованный в строку base64. К сожалению, результатом, который печатает использование NSLog, является просто пробел.
NSString *encodedGzippedString = @"GgAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyK+uE6X2SJPiyZ93eaX+TI9Lcuiatvx/wOwYc0HGgAAAA==";
NSData *decodedGzippedData = [NSData dataFromBase64String:encodedGzippedString];
NSData* unGzippedJsonData = [ASIHTTPRequest uncompressZippedData:decodedGzippedData];
NSString* unGzippedJsonString = [[NSString alloc] initWithData:unGzippedJsonData encoding:NSASCIIStringEncoding];
NSLog(@"Result: %@", unGzippedJsonString);
Ваша "сжатая" строка не является необработанными данными GZIP, она в некоторой кодировке, которая позволяет хранить эти байты в строке - выглядит как base-64 или что-то в этом роде. Чтобы получить из этого NSData, вам нужно декодировать его в NSData.
Если это действительно кодировка base-64, ознакомьтесь с этой записью в блоге с сопутствующим кодом: http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html который будет делать то, что вы хотите.
Если у вас есть объект NSData, метод ASIHTTPRequest, вероятно, будет действовать так, как вам нравится.