Compresser/Décompresser NSString en objective-c (iphone) à l'aide de GZIP ou deflate
J'ai une web-service en cours d'exécution sur Windows Azure qui renvoie du JSON que je consomme dans mon application iPhone.
Malheureusement, Windows Azure ne semble pas à l'appui de la compression de dynamique de réponses encore (longue histoire) j'ai donc décidé de le contourner par le renvoi d'une non compressé JSON emballage, qui contient un comprimé (à l'aide de GZIP) de la chaîne.
e.g
{"Error":null,"IsCompressed":true,"Success":true,"Value":"vWsAAB+LCAAAAAAAB..etc.."}
... où est la valeur de comprimé de chaîne d'un objet complexe représenté en JSON.
C'était vraiment facile à mettre en œuvre sur le serveur, mais pour la vie de moi je ne peux pas comprendre comment décompresser un format NSString en non compressé NSString, tous les exemples que je peux trouver pour zlib etc sont à faire avec les fichiers etc.
Quelqu'un peut me donner des indices sur la façon de faire cela? (Je serais également heureux de trouver une solution plus utilisé dégonfler comme j'ai pu changer de serveur-côté de la mise en œuvre utilisation de dégonfler un peu trop).
Merci!!
Steven
Edit 1: Aaah, je vois que ASIHTTPRequest est à l'aide de la fonction suivante dans le code source:
//uncompress gzipped data with zlib
+ (NSData *)uncompressZippedData:(NSData*)compressedData;
... et je suis conscient que je peux convertir NSString à NSData, donc je vais voir si cela me mène nulle part!
Edit 2: Malheureusement, la méthode décrite dans l'Édition 1 de ne pas me conduire n'importe où.
Edit 3: en Suivant les conseils ci-dessous, concernant le codage base64/décodage, je suis venu avec le code suivant. Le encodedGzippedString est comme vous pouvez le deviner, une chaîne de caractères "Bonjour, mon nom est Steven Elliott", qui est au format gzip et puis converti en une chaîne base64. Malheureusement, le résultat qui s'imprime en utilisant NSLog est juste vide.
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);
Vous devez vous connecter pour publier un commentaire.
Après tout ce temps, j'ai enfin trouvé une solution à ce problème!
Aucune des réponses ci-dessus m'ont aidé, comme prometteurs, car ils se ressemblaient tous. En fin de compte, j'ai été capable de compresser la chaîne sur le serveur à l'aide de gzip à l'aide de la chilkat cadre .net ... et puis le décompresser sur l'iphone à l'aide de la chilkat cadre pour iOS (pas encore publié, mais si vous envoyez le gars directement).
La chilkat cadre de ce super facile à faire, donc gros coup de pouce pour le développeur!
Votre "compressé" chaîne n'est pas cru GZIP avais données, c'est dans le codage qui permet à ces octets à être stocké dans une chaîne-- ressemble base-64, ou quelque chose comme ça. Pour obtenir un NSData dehors de cela, vous aurez besoin de le décoder dans le NSData.
Si c'est vraiment de base-64, consultez cet article de blog d'un accompagnement de code:
http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html
qui va faire ce que vous voulez.
Une fois que vous avez un NSData objet, le ASIHTTPRequest méthode sera probablement le faire comme vous le souhaitez.
Cela a fonctionné pour moi:
à partir d'une chaîne gzipeed, puis encodé en base64
onu-format de chaîne de caractères (tous les utf8).