压缩CFDataRef对象?

时间:2012-03-25 23:48:57

标签: macos compression core-foundation

查看CFDataRef的文档,我看不到任何会在创建CFDataRef后压缩它的内容。例如,在我的代码中,我做了类似这样的事情:

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

基本上,我正在从一块大小约为2MB的内存中创建一个CFDataRef。听起来不是很多,但在实际应用中,这个数据太多了。

创建后是否可以压缩CFDataRef对象?或者压缩它指向的原始数据可能会更好吗?

2 个答案:

答案 0 :(得分:1)

  

是否可以在创建后压缩CFDataRef对象?

zlib.h是一种选择。

  

或者压缩它指向的原始数据可能会更好吗?

你想花多少时间来开发这个?使用您对输入数据的了解,可以减少数据结构的大小? zlib(或其他lib)中的实现是不可接受的吗?

答案 1 :(得分:1)

我应该注意OS X现在有SecTransform https://developer.apple.com/library/mac/#documentation/System/Reference/SecTransform_header_reference/Reference/reference.html,您可以使用它来对CFData进行ZLib压缩。我有一个在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; 
}