Сожмите/Распакуйте NSString в цели-c (iPhone) с помощью GZIP или выкачайте

У меня есть веб-сервис, работающий на 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);  
8
задан Steven Elliott 15 June 2010 в 23:08
поделиться

1 ответ

Ваша "сжатая" строка не является необработанными данными GZIP, она в некоторой кодировке, которая позволяет хранить эти байты в строке - выглядит как base-64 или что-то в этом роде. Чтобы получить из этого NSData, вам нужно декодировать его в NSData.

Если это действительно кодировка base-64, ознакомьтесь с этой записью в блоге с сопутствующим кодом: http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html который будет делать то, что вы хотите.

Если у вас есть объект NSData, метод ASIHTTPRequest, вероятно, будет действовать так, как вам нравится.

1
ответ дан 5 December 2019 в 23:13
поделиться