EZFrag
EZFrag

Reputation: 302

Objective-C: How to parse NSData? How to break into smaller pieces?

I have the following data inside an NSData object:

<00000000 6f2d840e 31504159 2e535953 2e444446 3031a51b 8801015f
 2d02656e 9f110101 bf0c0cc5 0affff3f 00000003 ffff03>

This data contains information which is marked by tags:

Tag 1 is from byte value 0x84 to 0xa5,

Tag 2 is from byte value 0xa5 to 0x88,

Tag 3 is from byte value 0x88 to 0x5f2d,

Tag 4 is from byte value 0x5f2d to 0x9f11.

How would I go about to get the values of these "tags" from the NSData object?

Regards, EZFrag

Upvotes: 3

Views: 2410

Answers (2)

EZFrag
EZFrag

Reputation: 302

I managed a nice solution, deciding to actually use the graymatter

-(int)getIndexOfSubDataInData:(NSData*)haystack forData:(NSData*)needle{
    int dataCounter = 0;
    NSRange dataRange = NSMakeRange(dataCounter, [needle length]);
    NSData* compareData = [haystack subdataWithRange:dataRange];

    while (![compareData isEqualToData:needle]) {

        dataCounter++;
        dataRange = NSMakeRange(dataCounter, [needle length]);
        compareData = [haystack subdataWithRange:dataRange];
    }

    return dataCounter;
}

-(NSData*)getSubDataInData:(NSData*)targetData fromTag:(NSData*)fromTag toTag:(NSData*)toTag{

    int startIndex = [self getIndexOfSubDataInData:targetData forData:fromTag] + [fromTag length];
    int endIndex = [self getIndexOfSubDataInData:targetData forData:toTag];
    int dataLength = endIndex - startIndex;

    NSRange dataRange = NSMakeRange(startIndex, dataLength);

    return [targetData subdataWithRange:dataRange];
}

//here is how I use the code
 NSData* langTagStart=[[NSData alloc] initWithBytes:"\x5F\x2D" length:2];
    NSData* langTagEnd=[[NSData alloc] initWithBytes:"\x9F\x11" length:2];

    NSData* languageData = [self getSubDataInData:[response bytes] fromTag:langTagStart toTag:langTagEnd];

Thanks for your suggestions.

Regards, EZFrag

Upvotes: 1

Ole Begemann
Ole Begemann

Reputation: 135578

Use -[NSData bytes] to get a pointer to the contents. Then use pointer arithmetic to iterate over the bytes until you find what you are looking for. Since you want to go byte by byte, you should probably cast the pointer returned by bytes to uint8_t*. Then, pointer[0] points to the first byte, pointer[1] to the second, and so on.

Upvotes: 0

Related Questions