¿Hay alguna clase que permita comprimir datos usando Zlib, o está usando directamente zlib.dylib la única posibilidad que tengo?¿Cómo puedo comprimir datos usando Zlib, sin usar directamente zlib.dylib?
Respuesta
NSData + Compression es una implementación de categoría de NSData fácil de usar.
Uso:
NSData* compressed = [myData zlibDeflate];
NSData* originalData = [compressed zlibInflate];
Esto, tal vez: How to gzip Data in Memory Using Objective-C.
Gracias. Contiene el código que realmente necesito. No veo la parte para guardar los datos en un archivo, pero eso no es difícil de escribir. – kiamlaluno
Como alternativa, también hay objective-zip, que es, "una biblioteca pequeña Cocoa/Objective-C que envuelve ZLib y MiniZip de una manera amigable orientada a objetos ".
Creación de un archivo en un ".zip" archivo es simple como ejecutar el siguiente código:
ZipWriteStream *stream = [zipFile writeFileInZipWithName:@"abc.txt" compressionLevel:ZipCompressionLevelBest];
[stream writeData:abcData];
[stream finishedWriting];
La biblioteca también permite leer el contenido de un archivo ".zip", y enumerar los archivos contiene.
Al listar el contenido de un archivo ".zip" se hace desde un código similar al siguiente.
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];
}
Esto es lo que funcionó para mí: 1) ZLib basado Objetivo-Zip nueva ubicación: https://github.com/gianlucabertani/Objective-Zip
PODFILE:
pod 'objective-zip', '~> 1.0'
Ejemplo rápido:
#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) Otra biblioteca basada en zlib funcionó bien también. https://github.com/ZipArchive/ZipArchive
nota: A veces es necesario añadir libz.tbd (nuevo nombre de zlib.dylib) a "Enlace binario con Bibliotecas"
ejemplo rápido:
#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]];
}
}
- 1. Obtener el tamaño de los datos sin comprimir en zlib?
- 2. Cómo comprimir un búfer con zlib?
- 3. ¿Puedo comprimir datos en JavaScript?
- 4. Comprimir directamente desde una secuencia
- 5. Compresión y descompresión de datos usando zlib en Nodejs
- 6. zlib: Diferencias entre las funciones `desinflar` y` comprimir`
- 7. ¿Cómo puedo comprimir y encriptar un archivo grande sin usar DLL externos o tiempos de ejecución?
- 8. Cómo usar el módulo Node.js zlib con opciones?
- 9. ¿Puedo comprimir solicitudes HTTP usando GZIP?
- 10. Cómo comprimir un texto?
- 11. zlib decompression failure
- 12. Cómo comprimir archivos usando JavaScript
- 13. jquery "Minificado" Archivos "sin comprimir"
- 14. no puedo instalar Distribute, zlib
- 15. Cómo usar Logback directamente sin pasar por SLF4J
- 16. ¿Cómo puedo generar archivos y luego comprimir/comprimir con Heroku?
- 17. cómo usar sox para comprimir mp3?
- 18. Puede comprimirse Javascript sin comprimir
- 19. cómo comprimir una imagen PNG usando Java
- 20. zlib, deflate: ¿Cuánta memoria asignar?
- 21. Uso de zlib ycPickle para comprimir/descomprimir un diccionario en archivos
- 22. ¿Convertir javascript de minificado a sin comprimir?
- 23. Usando libtool sin usar enlaces
- 24. ¿Cómo puedo comprimir un directorio con .NET?
- 25. ¿Deberíamos usar ScalaSignature directamente?
- 26. Forma simple de descomprimir un archivo .zip usando zlib
- 27. ¿Puedo invocar javascript directamente en WPF sin usar el objeto de navegador?
- 28. ¿Cómo puedo assert() sin usar abort()?
- 29. no puede cargar dicho archivo - zlib incluso después de usar paquete RVM instalar zlib
- 30. ¿Cómo uso Minizip (en Zlib)?
El código que encontré en el enlace que informó es más completo, ya que también incluye la parte para calcular la suma de comprobación CRC32. – kiamlaluno
Gracias. Además, puede ser necesario reemplazar 'inflateInit (& strm)' en '-zlibInflate' por' inflateInit2 (& strm, 16 + MAX_WBITS) 'si obtiene' Z_DATA_ERROR' (-3) al intentar descomprimir archivos creados por una utilidad externa. –
URL no encontrada, ¡por favor actualice el enlace! Aun relevante... –