2012-06-12 4 views
2

У меня есть следующие данные внутри объекта NSData:Objective C - Разбираем NSData

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

У меня возникли проблемы синтаксического анализа этих данных. Эти данные содержат информацию, которая отмечена метками

Метка 1 от значения байта 0x84 до 0xA5

Метка 2 от значения байта 0xA5 до 0x88

Метка 3 от значения байта 0x88 до 0x5f0x2d

Тег 4 от байтового значения 0x5f0x2d до 0x9f0x11

Как бы я мог получить эти значения из объекта NSData?

С уважением, EZFrag

+0

@ETFrag, что ваш точный нужно? Я думаю, что лучше преобразовать его в NSString или что-то еще, как нужно. –

ответ

0

мне удалось хорошее решение, решив фактически использовать 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]; 

Спасибо за ваши предложения.

С уважением, EZFrag

+0

Я конвертирую NSString «Hello $ World $» в NSData, используя NSUTF8StringEncoding, а затем хочу найти World из этих данных, поэтому теперь я использовал ваш код выше и установил байты lagTagStart с «\ x24» (поскольку $ в байтах имеет значение 36 , то есть 24 в шестнадцатеричном формате) и длина 1, сделали аналогичную вещь для langTagEnd и переданы в getSubDataInData, как вы это сделали, но предоставили EXC_BAD_ACCESS в методе getSubDataInData, можете ли вы объяснить мне, почему эта вещь происходит и какие изменения мне нужно получить? Мир из этого. Спасибо заранее за вашу помощь –

0

Используйте -[NSData bytes], чтобы получить указатель на содержимое. Затем используйте арифметику указателей, чтобы перебирать байты, пока не найдете то, что ищете. Так как вы хотите побайтовать байтом, вам, вероятно, следует наложить указатель, возвращенный bytes на uint8_t*. Затем pointer[0] указывает на первый байт, pointer[1] на второй и т. Д.

+0

Я пробовал это, но я получил ошибку компилятора, когда пытался сравнить, указатель [0] с тегом [0], например. while (pointer [0]! = tag [0]) {} – EZFrag

+0

он жаловался на меня, сравнивая void const с void const – EZFrag

+0

Как предложил Оле, объявите ваши указатели 'uint8_t *', чтобы при их разыменовании вы получили 8-разрядные целые значения без знака для каждого байта. –

Смежные вопросы