How can I compress data using Zlib, without directly using zlib.dylib?

前端 未结 3 1832
情歌与酒
情歌与酒 2020-12-14 13:19

Is there a class that allows compressing data using Zlib, or is using zlib.dylib directly the only possibility I have?

相关标签:
3条回答
  • 2020-12-14 13:37

    Here is what worked for me: 1) ZLib based Objective-Zip new location: https://github.com/gianlucabertani/Objective-Zip

    Podfile:

    pod 'objective-zip', '~> 1.0'
    

    Quick example:

    #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) Other zlib based library worked fine too. https://github.com/ZipArchive/ZipArchive

    note: sometimes it's needed to add libz.tbd (new name of zlib.dylib) to "Link Binary With Libraries"

    Quick example:

    #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]];
        }
    }
    
    0 讨论(0)
  • 2020-12-14 13:51

    NSData+Compression is an easy to use NSData category implementation.

    • NSData+Compression.h
    • NSData+Compression.m

    Usage:

    NSData* compressed = [myData zlibDeflate];
    NSData* originalData = [compressed zlibInflate];
    
    0 讨论(0)
  • 2020-12-14 13:59

    As alternative, there is also objective-zip, which is, "a small Cocoa/Objective-C library that wraps ZLib and MiniZip in an object-oriented friendly way."

    Writing a file into a ".zip" archive is simple as executing the following code:

    ZipWriteStream *stream = [zipFile writeFileInZipWithName:@"abc.txt" compressionLevel:ZipCompressionLevelBest];
    [stream writeData:abcData];
    [stream finishedWriting];
    

    The library allows also to read the content of a ".zip" file, and to enumerate the files it contains.

    Listing the content of a ".zip" file is done from code similar to the following one.

    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];
    }
    
    0 讨论(0)
提交回复
热议问题