2012-03-25 30 views
0

查看CFDataRef的文檔,我看不到任何將在創建CFDataRef後壓縮的東西。例如,在我的代碼我做這樣的事情:壓縮CFDataRef對象?

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

基本上,我從一塊內存是約2MB大小創建CFDataRef。聽起來不太多,但在實際應用中,這是太多的數據。

是否可以在創建後壓縮CFDataRef對象?或者,最好先壓縮它指向的原始數據?

回答

1

是否可以在創建後壓縮CFDataRef對象?

zlib.h是一種選擇。

或者壓縮原先指向的原始數據可能會更好嗎?

你想花費多少時間來開發它?使用您所瞭解的輸入數據可以如何減少數據結構的大小? zlib(或另一個lib)中的實現是不可接受的嗎?

+0

感謝zlib的建議。由於時間限制,我希望獲得CFCreateCompressedDataRef()或類似的函數。在未來的更新中,我可以減少需要存儲的數據量。 – 2012-03-26 16:09:39

+0

@StephenBlinkhorn歡迎您。使用zlib非常簡單,但它不是一次性的。還要注意有更好的算法,有些更適合於特定的目的。對於圖像或音頻,框架中有幾個選項(可能產生比zlib更小的尺寸,但如果音頻可能比zlib實現起來更復雜)。 – justin 2012-03-27 00:37:30

+0

當然,我確實在研究音頻應用程序,但我想壓縮的數據不是音頻信號數據。它主要是會話數據 - 音樂序列,控制數據,參數等。它應該壓縮得非常好(壓縮查找器中的文件減少了70%的文件大小),但是這將不得不等待更新。 – 2012-03-27 18:59:00

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