2010-06-10 10 views
8

Ich habe einen Web-Service unter Windows Azure, die JSON, die ich in meiner iPhone-App konsumieren.Komprimieren/Dekomprimieren NSString in Ziel-c (iPhone) mit GZIP oder deflate

Leider scheint Windows Azure die Komprimierung dynamischer Antworten noch nicht zu unterstützen (lange Geschichte), also entschied ich mich, es durch die Rückgabe eines unkomprimierten JSON-Pakets zu umgehen, das eine komprimierte (mit GZIP) Zeichenfolge enthält.

z.B

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

... wo die komprimierten String-Wert eines komplexen Objekts in JSON dargestellt ist.

Das war wirklich einfach auf dem Server zu implementieren, aber für das Leben von mir kann ich nicht herausfinden, wie man einen gezippten NSString in einen unkomprimierten NSString dekomprimiert, alle Beispiele, die ich für zlib usw. finden kann, befassen sich mit Dateien etc.

Kann mir jemand Hinweise geben, wie man das macht? (Ich würde mich auch über eine Lösung freuen, die deflate verwendet, da ich die serverseitige Implementierung ändern könnte, um Deflate auch zu verwenden).

Danke !!

Steven

Edit 1: Aaah, ich sehe, dass ASIHTTPRequest darin die folgende Funktion verwendet Quellcode:

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

... und ich bin mir bewusst, dass ich NSString konvertieren zu NSData, also werde ich sehen, ob das mich irgendwohin führt!

Edit 2: Leider führte mich die in Edit 1 beschriebene Methode nirgendwohin.

Edit 3: Befolgen Sie die folgenden Hinweise zur base64-Kodierung/Dekodierung, ich kam mit dem folgenden Code. Der codedGzippedString ist, wie Sie erraten können, eine Zeichenfolge "Hallo, mein Name ist Steven Elliott", die gezippt und dann in eine Base64-Zeichenfolge konvertiert wird. Leider ist das Ergebnis, das mit NSLog druckt, einfach leer.

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); 

Antwort

3

Nach all dieser Zeit fand ich endlich eine Lösung für dieses Problem!

Keine der obigen Antworten hat mir geholfen, so vielversprechend wie sie alle aussahen.Am Ende war ich in der Lage, die Zeichenfolge auf dem Server mit gzip mit dem chilkat Framework für .net zu komprimieren ... und dann auf dem iPhone mit dem chilkat Framework für iOS zu dekomprimieren (noch nicht veröffentlicht, aber verfügbar, wenn Sie die Typ direkt).

Das chilkat-Framework machte es super einfach, so großen Daumen hoch zum Entwickler!

+0

Hallo, können Sie eine genaue Verbindung zum Framework bereitstellen? –

+0

http://www.chilkatsoft.com/downloads_ios.asp – dirkoneill

+0

Wie verwendet man chilkat framework? –

1

Ihr „komprimiert“ string ist nicht roh gzip Daten, es in irgendeiner Codierung ist, dass dieses Bytes ermöglicht in einem string-- gespeichert werden sieht aus wie Base-64 oder etwas ähnliches. Um daraus eine NSData zu erhalten, müssen Sie diese in die NSData dekodieren.

Wenn es wirklich Base-64 ist, schauen Sie sich diesen Blog-Beitrag einen begleitenden Code: http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html was tun wird, was Sie wollen.

Sobald Sie ein NSData-Objekt haben, wird die ASIHTTPRequest-Methode wahrscheinlich wie Sie möchten.

+0

Hallo Quixoto, Danke für Ihre Antwort. Wenn Sie in meinem ursprünglichen Beitrag "Edit 3" überprüfen, werden Sie sehen, was passiert ist, nachdem ich versucht habe, Ihren Ratschlag zu verwenden. Danke nochmal –

+0

Das ist eine vernünftige Reihe von Schritten, so was nicht klar ist: Ist die übertragene Zeichenfolge definitiv Base64? (wahrscheinlich) Wie lautet die ursprüngliche Codierung der ursprünglichen Zeichenfolge in Windows Land? Sie wählen eine ASCII-Kodierung für die Dekodierung, die wahrscheinlich nicht korrekt ist. Sind die Daten im NSData-Puffer überhaupt bekannt? –

0

Dies funktionierte für mich: von einer Zeichenfolge gzipeed, dann base64 codiert zu entzippter Zeichenfolge (alle 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 
Verwandte Themen