распаковать NSData с помощью объективного zip

Недавно я нашел Objective Zip. Я читал инструкции, чтобы настроить его в своем проекте. . Однако я не совсем уверен, как использовать его для распаковки некоторых NSData, которые у меня есть, которые я хочу распаковать.

Я просмотрел пример решения, и, похоже, он выполняет распаковку zip-файла, код выглядит примерно так

ZipFile *unzipFile= [[ZipFile alloc] initWithFileName:filePath mode:ZipFileModeUnzip];

[unzipFile goToFirstFileInZip];
ZipReadStream *read1= [unzipFile readCurrentFileInZip];

дать или принять некоторые другие инструкции, вот как они показывают вам, как их использовать, их пример кода здесь

Я хотел бы знать, как сделать то же самое, но с использованием NSData? или мне придется преобразовать NSData в zipFile? если да, то как это выполняется правильно?

NSData, который я пытаюсь разархивировать, если zlib сжат... любой пример кода будет полезен


person HurkNburkS    schedule 12.12.2012    source источник


Ответы (1)


вот это https://stackoverflow.com/a/6466832/751885

Я использую следующие два метода обработки NSData

и позвони

saveToFile 

метод записи на диск.

[[self compressData:uncompressedData] writeToFile:@"fileName.zip" atomically:YES];

Компресс:

-(NSData*) compressData:(NSData* )uncompressedData {
if ([uncompressedData length] == 0) return uncompressedData;

z_stream strm;

strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.total_out = 0;
strm.next_in=(Bytef *)[uncompressedData bytes];
strm.avail_in = (unsigned int)[uncompressedData length];

// Compresssion Levels:
//   Z_NO_COMPRESSION
//   Z_BEST_SPEED
//   Z_BEST_COMPRESSION
//   Z_DEFAULT_COMPRESSION

if (deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY) != Z_OK) return nil;

NSMutableData *compressed = [NSMutableData dataWithLength:16384];  // 16K chunks for expansion

do {

    if (strm.total_out >= [compressed length])
        [compressed increaseLengthBy: 16384];

    strm.next_out = [compressed mutableBytes] + strm.total_out;
    strm.avail_out = (unsigned int)([compressed length] - strm.total_out);

    deflate(&strm, Z_FINISH);  

} while (strm.avail_out == 0);

deflateEnd(&strm);

[compressed setLength: strm.total_out];
return [NSData dataWithData:compressed];
}

Распаковать:

-(NSData*) uncompressGZip:(NSData*) compressedData {
if ([compressedData length] == 0) return compressedData;

NSUInteger full_length = [compressedData length];
NSUInteger half_length = [compressedData length] / 2;

NSMutableData *decompressed = [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)[compressedData length];
strm.total_out = 0;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;

if (inflateInit2(&strm, (15+32)) != Z_OK) return nil;

while (!done) {
    // Make sure we have enough room and reset the lengths.
    if (strm.total_out >= [decompressed length]) {
        [decompressed increaseLengthBy: half_length];
    }
    strm.next_out = [decompressed mutableBytes] + strm.total_out;
    strm.avail_out = (unsigned int)([decompressed 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) {
        break;
    }
}
if (inflateEnd (&strm) != Z_OK) return nil;

// Set real length.
if (done) {
    [decompressed setLength: strm.total_out];
    return [NSData dataWithData: decompressed];
} else {
    return nil;
}
}
person jetmc    schedule 12.12.2012
comment
Holy Moly, поэтому, если у меня есть сжатые zlib NSData, я просто добавляю этот нижний метод в свой файл .m, а затем вызываю его, из какого метода мне нужно его использовать? Когда вы говорите call ** saveToFile **, что, если мне просто нужен возвращенный несжатый NSData, могу ли я использовать его, как мне нравится? - person HurkNburkS; 12.12.2012
comment
Я только что добавил его в свой текущий файл .m, где мне нужно его использовать, все кажется в порядке, кроме объектов z_stream и strm.. они вызывают ошибки.. есть идеи, что мне нужно сделать, чтобы исправить это? - person HurkNburkS; 12.12.2012
comment
Я прочитал другую ссылку, которую вы мне прислали, но это не очень помогло, так как это то же самое, что вы разместили здесь, любая дополнительная помощь будет очень признательна. - person HurkNburkS; 12.12.2012
comment
[[сам сжатиеДанные:oriNSData] writeToFile:@fileName атомарно:ДА] - person jetmc; 12.12.2012
comment
Хорошо, поэтому я попытался запустить NSData, закодированный в zlib, с помощью метода декомпрессии, и он всегда возвращает ноль. Я прошел через него, и он возвращает разрыв; в else if (status != Z_OK) у вас есть предложения, почему это может быть? например, мне нужно использовать gziped NSdata для этого метода? - person HurkNburkS; 13.12.2012
comment
Извините, я не могу открыть свой Xcode сейчас. но я нашел некоторые другие ресурсы NSDataCategory, которые могут вам помочь. категория NSData, поддерживающая сжатие/распаковку gzip и zlib. - person jetmc; 13.12.2012
comment
Как можно делать все это в памяти? Также я бы использовал Swift. Это возможно с Kotlin/Java stackoverflow.com/questions/55089278/ - person user25; 10.03.2019