Ich habe eine NSString
(z. B. eNoLycgsVgChvILSEoWS1IoSPQBFZgb4
), die ich von einem Webserver, der nur eine normale Zeichenfolge komprimiert unter Verwendung zlib
ist. Wie dekomprimiere ich das in Objective-C? Ich habe einige Bibliotheken gefunden, aber sie akzeptieren nur vollständige Dateien, keine einfache Zeichenfolge.Wie dekomprimiere ich einen NSString, den ich mit zlib komprimiert habe
Antwort
OK basierend auf dem oben genannten scheint es, dass Sie nicht wirklich wissen, was das Format ist - aber scheint, dass es ZLib deflate
, Base64 codiert ist. Abschreiben schamlos aus anderen Antworten Stackoverflow, hier ist ein Stück Code, der Ihre Daten dekomprimiert werden:
#import <Foundation/Foundation.h>
#import <zlib.h>
int main(int argc, const char * argv[])
{
@autoreleasepool
{
NSLog(@"Starting...");
NSString * base64String = @"eJwLycgsVgChvILSEoWS1IoSPQBFZgb4";
NSData * compressedData = [ [ NSData alloc ] initWithBase64EncodedString: base64String options: 0 ];
NSUInteger full_length = [ compressedData length ];
NSUInteger half_length = [ compressedData length ]/2;
NSMutableData * decompressedData = [ NSMutableData dataWithLength: full_length + half_length ];
BOOL done = NO;
int status;
z_stream strm;
strm.next_in = (Bytef *)[ compressedData bytes ];
strm.avail_in = (unsigned int) full_length;
strm.total_out = 0;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
if (inflateInit2(&strm, (15 + 32)) != Z_OK)
{
NSLog(@"Could not initialise ZLib");
return EXIT_FAILURE;
}
while (done == NO)
{
// Make sure we have enough room and reset the lengths.
if (strm.total_out >= [ decompressedData length ])
{
[ decompressedData increaseLengthBy: half_length ];
}
strm.next_out = [ decompressedData mutableBytes ] + strm.total_out;
strm.avail_out = (unsigned int)([ decompressedData length ] - strm.total_out);
// Inflate another chunk.
status = inflate(&strm, Z_SYNC_FLUSH);
if (status == Z_STREAM_END)
{
done = YES;
}
else if (status != Z_OK)
{
NSLog(@"Decompression failed with status %i", status);
break;
}
}
if (inflateEnd(&strm) != Z_OK)
{
NSLog(@"Could not complete decompression");
return EXIT_FAILURE;
}
// Set real length.
if (done)
{
[ decompressedData setLength: strm.total_out ];
NSString * string = [ [ NSString alloc ] initWithData: decompressedData
encoding: NSUTF8StringEncoding ];
NSLog(@"String: %@", string);
}
else
{
return EXIT_FAILURE;
}
}
NSLog(@"...Success");
return EXIT_SUCCESS;
}
Sobald er ausgeführt wird, das druckt etwas wie:
2016-06-16 12:40:14.454 Objective Z[82569:7532295] Starting...
2016-06-16 12:40:14.455 Objective Z[82569:7532295] String: This is input text.
2016-06-16 12:40:14.455 Objective Z[82569:7532295] ...Success
Program ended with exit code: 0
Sie benötigen Sie, um sicherzustellen, verknüpfen gegen ZLib. Aus dem Abschnitt "Build Phases" Ihres Projekts in XCode unter "Link Binary with Libraries" gibt der "+" - Button ein durchsuchbares Popup-Fenster; Suchen Sie nach "libz". Dies ist unter iOS möglicherweise nicht verfügbar. es ist in dem OS X SDK vorhanden; Das geht über den Rahmen dieser Antwort hinaus und Google wird zweifellos eine Antwort schnell geben, wenn Sie Probleme haben.
Was meinen Sie mit "komprimiert"? Die betreffende Zeichenfolge ist nicht binär komprimiert, da sie ASCII-Zeichen verwendet, aber sie sieht auch nicht wie Base64 aus. Welche GLib-Methode wurde verwendet, um das von Ihnen angegebene Beispiel zu erstellen und was war die ursprüngliche Eingabezeichenfolge? –
@AndrewHodgkinson Hier ist eine Beispiel-Website, die es zeigt: http://www.unit-conversion.info/texttools/compress/ Sie können den Text eingeben, um vorhandenen Text zu entlüften oder aufzublasen. Diese Website dekomprimiert den Text, den ich von der API des Servers erhalte, so dass ich einfach neugierig bin, wie ich es lokal machen würde. –
@AndrewHodgkinson Ähnlich wird diese Seite dasselbe mit Deflate tun http://www.txtwizard.net/compression –