问题
I have an NSData object which contains some data I need. What I wanted to do is to find out the position of data "FF D8" (start of JPEG data)
How can I achieve work like this?
回答1:
First get the range, then get the data:
// 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)];
}
回答2:
Try 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);
}
来源:https://stackoverflow.com/questions/18477710/how-do-i-check-whether-an-nsdata-object-contains-a-sub-nsdata