CFArray to NSData to NSImage - PullRequest
       23

CFArray to NSData to NSImage

0 голосов
/ 23 апреля 2011

У меня есть файл plist с данными фотографии jpeg. Мне нужно вытащить эту фотографию. Я могу прочитать файл plist в NSDictionary и получить доступ к объекту по ключу "jpegphoto". Проблема в том, что возвращаемый объект - это NSCFArray, с которым я понятия не имею, как работать. Я могу распечатать его и вижу хороший поток октетов, но это все, что я умею делать. Как я могу получить этот NSCFArray в NSData или байтовый массив?

CFArray при передаче в NSLog, вот так

NSLog(@"%@", [plistDictionary objectForKey:@"jpegphoto"]);

Выплевывает сотни строк, похожих на

5ed15ee6 df44b2ff 00899699 0dd23b58 dccdcadc 6c8d04e1 8b3e1940 af76953e 7c0e1b56 

Я знаю, что это CFArray, который я сделал

NSLog(@"%@", NSStringFromClass([[data_dictionary objectForKey:@"jpegphoto"] class]));

И вернулся

NSCFArray

Спасибо

1 Ответ

0 голосов
/ 23 апреля 2011

Все, что я могу придумать, было бы так:

NSArray * array = [ data_dictionary valueForKey:@"jpegphoto" ] ;
NSMutableData * data = [ NSMutableData dataWithCapacity:array.count * 4 ] ;
uint32_t * dataPtr = [ data mutableBytePtr ] ;
NSUInteger index = 0 ;
for( NSNumber * number in array )
{
    dataPtr[ index++ ] = [ number unsignedLongValue ] ;
}

Предполагая, что массив полон экземпляров CF / NSNumber.Если это CFArray примитивных (не объектных) значений, попробуйте что-то вроде этого:

CFArrayRef array = (CFArrayRef)[ data_dictionary valueForKey:@"jpegphoto" ] ;
CFDataRef data = CFDataCreateMutable( kCFAllocatorDefault, CFArrayGetCount( array ) * 4 ) ;
CFArrayGetValues( array, (CFRange){ 0, CFArrayGetCount( array ) }, (void**)CFDataGetMutableBytePtr( data ) ) ;
...