Gibt es eine Klasse, die das Komprimieren von Daten mit Zlib ermöglicht, oder ist zlib.dylib direkt die einzige Möglichkeit, die ich habe?Wie kann ich Daten mit Zlib komprimieren, ohne direkt zlib.dylib zu verwenden?
Antwort
NSData + Compression ist eine benutzerfreundliche Implementierung der NSData-Kategorie.
Verbrauch:
NSData* compressed = [myData zlibDeflate];
NSData* originalData = [compressed zlibInflate];
Dies, vielleicht: How to gzip Data in Memory Using Objective-C.
Danke. Es enthält den Code, den ich tatsächlich brauche. Ich sehe den Teil nicht, um die Daten in einer Datei zu speichern, aber das ist nicht schwer zu schreiben. – kiamlaluno
Als Alternative gibt es auch objective-zip, das ist „, eine kleine Cocoa/Objective-C-Bibliothek, die Wraps ZLib und MiniZip in einer objektorientierten freundlichen Art. "
Schreiben einer Datei in eine „.zip“ Archiv ist einfach, wie die Ausführung der folgenden Code ein:
ZipWriteStream *stream = [zipFile writeFileInZipWithName:@"abc.txt" compressionLevel:ZipCompressionLevelBest];
[stream writeData:abcData];
[stream finishedWriting];
Die Bibliothek ermöglicht auch den Inhalt einer „.zip“ Datei zu lesen, und die Dateien aufzulisten es beinhaltet.
Das Auflisten des Inhalts einer ".zip" -Datei erfolgt anhand eines Codes ähnlich dem folgenden.
ZipFile *unzipFile = [[ZipFile alloc] initWithFileName:@"test.zip" mode:ZipFileModeUnzip];
NSArray *infos = [unzipFile listFileInZipInfos];
for (FileInZipInfo *info in infos) {
NSLog(@"- %@ %@ %d (%d)", info.name, info.date, info.size, info.level);
// Locate the file in the zip
[unzipFile locateFileInZip:info.name];
// Expand the file in memory
ZipReadStream *read = [unzipFile readCurrentFileInZip];
NSMutableData *data = [[NSMutableData alloc] initWithLength:256];
int bytesRead = [read readDataWithBuffer:data];
[read finishedReading];
}
Hier ist, was für mich gearbeitet: 1) ZLib Basis Objective-Zip neuen Standort: https://github.com/gianlucabertani/Objective-Zip
Podfile:
pod 'objective-zip', '~> 1.0'
Schnell Beispiel:
#import "ViewController.h"
#import "Objective-Zip.h"
@interface ViewController()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *docsDir;
NSArray *dirPaths;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
NSString *path = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent:@"test.zip"]];
OZZipFile *zipFile= [[OZZipFile alloc] initWithFileName:path
mode:OZZipFileModeCreate];
NSString *str = @"Hello world";
OZZipWriteStream *stream= [zipFile writeFileInZipWithName:@"file.txt"
compressionLevel:OZZipCompressionLevelBest];
[stream writeData:[str dataUsingEncoding:NSUTF8StringEncoding]];
[stream finishedWriting];
[zipFile close];
}
2) Andere zlib basierte Bibliothek funktionierte auch gut. https://github.com/ZipArchive/ZipArchive
Anmerkung: Manchmal ist es erforderlich libz.tbd (neuer Name von zlib.dylib) auf "Link-Binary mit Bibliotheken"
Schnell Beispiel hinzuzufügen:
#import "SSZipArchive.h"
...
- (void)viewDidLoad {
[super viewDidLoad];
NSString *docsDir;
NSArray *dirPaths;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
NSError *error;
NSString *str = @"Hello world";
NSString *fileName = [docsDir stringByAppendingPathComponent:@"test.txt"];
BOOL succeed = [str writeToFile:fileName atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (succeed){
NSString *path = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent:@"test.zip"]];
[SSZipArchive createZipFileAtPath:path withFilesAtPaths:@[fileName]];
}
}
Der Code, den ich in dem von Ihnen gemeldeten Link gefunden habe, ist vollständiger, da er auch den Teil enthält, um die CRC32-Prüfsumme zu berechnen. – kiamlaluno
Großartig danke. Es kann auch erforderlich sein, "inflateInit (& strm)" in "-zlibInflate" zu ersetzen, um "inflateInit2" (& strm, 16 + MAX_WBITS) zu '' wenn Sie 'Z_DATA_ERROR' (-3) beim Dekomprimieren von Dateien erhalten, die von einem externen Dienstprogramm erstellt wurden. –
URL nicht gefunden, bitte Link aktualisieren! Immer noch relevant... –