2012-03-25 3 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() 또는 유사한 함수가 필요했습니다. 향후 업데이트에서는 저장해야하는 데이터의 양을 줄일 수 있습니다. –

+0

@StephenBlinkhorn 환영합니다. zlib를 사용하는 것은 매우 간단하지만 한 줄짜리는 아닙니다. 또한 더 나은 알고리즘이 있으며 특정 알고리즘에 더 적합한 알고리즘도 있습니다. 이미지 또는 오디오의 경우 프레임 워크에 몇 가지 옵션이 있습니다 (zlib보다 작은 크기를 생성 할 수 있지만 오디오의 경우 zlib보다 구현이 더 복잡 할 수 있음). – justin

+0

음, 실제로 오디오 응용 프로그램에서 작업하고 있지만 압축하려는 데이터는 오디오 신호 데이터와 같지 않습니다. 음악 시퀀스, 제어 데이터, 매개 변수 등 대부분 세션 데이터입니다. 압축이 잘되어야합니다 (파인더에서 파일을 압축하면 파일 크기가 70 %까지 줄어 듭니다). 그러나 업데이트를 기다려야합니다. –

1

OS X에는 이제 CFData에서 ZLib 압축을 수행하는 데 사용할 수있는 SecTransform https://developer.apple.com/library/mac/#documentation/System/Reference/SecTransform_header_reference/Reference/reference.html이 있습니다. 여기에 사용 예가 있습니다. 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; 
}