Сжатие объекта CFDataRef? - PullRequest
0 голосов
/ 26 марта 2012

Просматривая документацию для CFDataRef, я не вижу ничего, что могло бы сжать CFDataRef после того, как он был создан.Например, в моем коде я делаю что-то вроде этого:

CFIndex byteSize = GetExportByteSize();
const UInt8 *exportData = GetExportDataPtr();
CFDataRef dataRef = CFDataCreate(kCFAllocatorDefault, exportData, byteSize);
CFDictionarySetValue(dict, kAS_ExportDataKey, dataRef);

По сути, я создаю CFDataRef из фрагмента памяти размером около 2 МБ.Звучит не так много, но на практике для этого приложения это слишком много данных.

Можно ли сжимать объект CFDataRef после создания?Или лучше сжать необработанные данные, на которые он указывает в первую очередь?

Ответы [ 2 ]

1 голос
/ 23 апреля 2012

Следует отметить, что в OS X теперь есть SecTransform https://developer.apple.com/library/mac/#documentation/System/Reference/SecTransform_header_reference/Reference/reference.html, которую можно использовать для сжатия ZLib на CFData.У меня есть пример использования здесь https://github.com/Machx/Zangetsu/blob/master/Source/CWZLib.m

-(NSData *)cw_zLibCompress {
    SecTransformRef encoder;
    CFDataRef data = NULL;
    CFErrorRef error = NULL;

    CFDataRef inputData = CFDataCreate(kCFAllocatorDefault, [self bytes], [self length]);
    if (inputData == NULL) { return nil; }

    encoder = SecEncodeTransformCreate(kSecZLibEncoding, &error);
    if(error) { CWZLIBCLEANUP(); return nil; }

    SecTransformSetAttribute(encoder, kSecTransformInputAttributeName, inputData, &error);
    if (error) { CWZLIBCLEANUP(); return nil; }

    data = SecTransformExecute(encoder, &error);
    if (error) { CWZLIBCLEANUP(); return nil; }

    NSData *compressedData = [[NSData alloc] initWithData:(__bridge NSData *)data];
    CFRelease(encoder);
    CFRelease(inputData);

    return compressedData; 
}
1 голос
/ 26 марта 2012

Можно ли сжимать объект CFDataRef после создания?

zlib.h - это один из вариантов.

Или лучше сжатьнеобработанные данные, на которые он указывает в первую очередь?

Сколько времени вы хотите потратить на разработку этого?Насколько хорошо можно уменьшить размер структуры данных, используя то, что вы знаете о входных данных?Является ли реализация в zlib (или другой lib) неприемлемой?

...