Domanda

Ho un web-servizio in esecuzione su Windows Azure che restituisce JSON che consumo nel mio iPhone app.

Purtroppo, Windows Azure non sembra supportare la compressione delle risposte dinamiche ancora (storia lunga) così ho deciso di aggirare l'ostacolo restituendo un pacchetto di JSON non compresso, che contiene una (usando gzip) stringa compressa.

es

{"Error":null,"IsCompressed":true,"Success":true,"Value":"vWsAAB+LCAAAAAAAB..etc.."}

... dove il valore è la stringa compresso di un oggetto complesso rappresentato in JSON.

Questa è stata davvero facile da implementare sul server, ma per la vita di me non riesco a capire come decomprimere un NSString gzip in un NSString non compresso, tutti gli esempi che posso trovare per zlib ecc sono si tratta di file, ecc .

qualcuno può darmi qualche indizio su come fare questo? (Mi piacerebbe anche essere felice per una soluzione che sgonfiare utilizzata come ho potuto cambiare l'implementazione lato server per utilizzare deflate troppo).

Grazie !!

Steven

Modifica 1: Aaah, vedo che ASIHTTPRequest sta usando la seguente funzione in esso del codice sorgente:

//uncompress gzipped data with zlib
+ (NSData *)uncompressZippedData:(NSData*)compressedData;

... e mi rendo conto che posso convertire NSString a NSData, così vedrò se questo mi porta ovunque!

Modifica 2:. Purtroppo, il metodo descritto in Modifica 1 non mi ha portato da nessuna parte

Modifica 3: Seguendo i consigli di seguito per quanto riguarda la codifica Base64 / decodifica, mi si avvicinò con il seguente codice. L'encodedGzippedString è come si può intuire, una stringa "Ciao, il mio nome è Steven Elliott", che viene compresso con gzip e poi convertito in una stringa base64. Purtroppo, il risultato che le stampe utilizzando NSLog è solo vuota.

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);  
È stato utile?

Soluzione

Dopo tutto questo tempo, ho finalmente trovato una soluzione a questo problema!

Nessuna delle risposte sopra mi ha aiutato, come promettente come sembravano tutti. Alla fine, sono stato in grado di comprimere la stringa sul server con gzip utilizzando il framework .net chilkat per ... e poi decomprimerlo su iPhone utilizzando il framework chilkat per iOS (non ancora rilasciato, ma disponibile se l'email ragazzo direttamente).

Il quadro chilkat reso questo super facile farlo lode allo sviluppatore!

Altri suggerimenti

La stringa "compressa" non è compresso con gzip dati grezzi, è in qualche codifica che permette quei byte per essere conservati in un aspetto string-- come base-64 o qualcosa di simile. Per ottenere una NSData fuori da questo, avrete bisogno di decodificarlo nella NSData.

Se è davvero base-64, controlla questo post del blog di un codice di accompagnamento: http://cocoawithlove.com/2009/06/ base64-codifica-opzioni-on-mac-and.html che farà ciò che si desidera.

Una volta che avete un oggetto NSData, il metodo ASIHTTPRequest probabilmente fare come ti piace.

Questo ha funzionato per me: da un gzipeed stringa, base64 codificato a stringa non-gzip (tutti utf8).

#import "base64.h"
#import "NSData+Compression.h"

...

+(NSString *)gunzipBase64StrToStr:(NSString *)stringValue {
    //now we decode from Base64
    Byte inputData[[stringValue lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];//prepare a Byte[]
    [[stringValue dataUsingEncoding:NSUTF8StringEncoding] getBytes:inputData];//get the pointer of the data
    size_t inputDataSize = (size_t)[stringValue length];
    size_t outputDataSize = EstimateBas64DecodedDataSize(inputDataSize);//calculate the decoded data size
    Byte outputData[outputDataSize];//prepare a Byte[] for the decoded data
    Base64DecodeData(inputData, inputDataSize, outputData, &outputDataSize);//decode the data
    NSData *theData = [[NSData alloc] initWithBytes:outputData length:outputDataSize];//create a NSData object from the decoded data
                                                                                      //NSLog(@"DATA: %@ \n",[theData description]);

    //And now we gunzip:
    theData=[theData gzipInflate];//make bigger==gunzip
    return [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
}

@end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top