2013-08-28 106 views
0

我有一個NSData對象,其中包含我需要的一些數據。我想要做的是找出數據「FF D8」的位置(JPEG數據的開頭)如何檢查NSData對象是否包含子NSData?

我該如何實現這樣的工作?

+1

使用'-bytes'方法得到的指針數據,然後做一個循環,尋找0xff,如果發現它,檢查是否後面跟着0xd8。 – zneak

+0

這是一種方法。但我想知道是否有更短的編碼方式,比如NSString的rangeOfString:Oops,我只是發現NSData的方法'rangeOfData:options:range:'。似乎對我有用? –

回答

9

首先得到該範圍內,則獲得數據:

// The magic start data object is only created once safely and 
// then reused each time 
static NSData* magicStartData = nil; 
static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    static const uint8_t magic[] = { 0xff, 0xd8 }; 
    magicStartData = [NSData dataWithBytesNoCopy:(void*)magic length:2 freeWhenDone:NO]; 
}); 

// assume data is the NSData with embedded data 
NSRange range = [data rangeOfData:magicStartData options:0 range:NSMakeRange(0, [data length])]; 
if (range.location != NSNotFound) { 
    // This assumes the subdata doesn't have a specific range and is just everything 
    // after the magic, otherwise adjust 
    NSData* subdata = [data subdataWithRange:NSMakeRange(range.location, [data length] - range.location)]; 
} 
+0

謝謝!順便說一句,有沒有什麼辦法像'靜態NSdata * magicStartData = [NSData dataWithBytesNoCopy:{0xff,0xd8} length:2 freeWhenDone:NO];'使數據比較不變?由於這個「FF D8」數據不需要頻繁分配。 –

+0

@AndrewChang你可以用'dispatch_once'調用。我會更新我的答案以表明這是一個例子。 –

+0

哇,我以前還不知道這個功能。另一個新的知識,謝謝! –

1

嘗試NSData rangeOfData:options:range:

NSData *data = /* Your data here */; 

    UInt8 bytes_to_find[] = { 0xFF, 0xD8 }; 
    NSData *dataToFind = [NSData dataWithBytes:bytes_to_find 
             length:sizeof(bytes_to_find)]; 

    NSRange range = [data rangeOfData:dataToFind 
           options:kNilOptions 
           range:NSMakeRange(0u, [data length])]; 

    if (range.location == NSNotFound) { 
     NSLog(@"Bytes not found"); 
    } 
    else { 
     NSLog(@"Bytes found at position %lu", (unsigned long)range.location); 
    }