Как я могу сжать данные, используя Zlib, без непосредственного использования zlib.dylib? - PullRequest
5 голосов
/ 18 декабря 2009

Есть ли класс, который позволяет сжимать данные с помощью Zlib или напрямую использует zlib.dylib единственная возможность, которую я имею?

Ответы [ 4 ]

11 голосов
/ 18 декабря 2009

NSData + Compression - простая в использовании реализация категории NSData.

Использование:

NSData* compressed = [myData zlibDeflate];
NSData* originalData = [compressed zlibInflate];
4 голосов
/ 18 декабря 2009
1 голос
/ 28 сентября 2017

Вот что у меня сработало: 1) Новое местоположение на основе ZLib Objective-Zip: https://github.com/gianlucabertani/Objective-Zip

Podfile:

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

Быстрый пример:

#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) Другие библиотеки на базе zlib тоже работали нормально. https://github.com/ZipArchive/ZipArchive

примечание: иногда необходимо добавить libz.tbd (новое имя zlib.dylib) в "Link Binary With Libraries"

Быстрый пример:

#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 голосов
/ 19 сентября 2011

В качестве альтернативы существует также target-zip , то есть «небольшая библиотека Cocoa / Objective-C, которая упаковывает ZLib и MiniZip объектно-ориентированным дружественным способом».

Записать файл в архив «.zip» просто, выполнив следующий код:

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

Библиотека также позволяет читать содержимое файла ".zip" и перечислять содержащиеся в нем файлы.

Список содержимого файла ".zip" сделан из кода, подобного следующему.

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];
}
...