2012-06-12 102 views
2

我有一個NSData對象中的以下數據:目標C - 解析NSData的

< 00000000 6f2d840e 31504159 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]; 

感謝您的建議。

Regards, EZFrag

+0

我使用NSUTF8StringEncoding將NSString「Hello $ World $」轉換爲NSData,然後希望從該數據中找到World,所以現在我已經使用了上面的代碼並將「\ x24」設置爲lagTagStart的字節(因爲$ in Bytes的值爲36 ,即十六進制24)和長度1,爲langTagEnd做類似的事情,並傳遞給getSubDataInData,因爲你已經做了,但它給方法getSubDataInData EXC_BAD_ACCESS,你能解釋我爲什麼這件事情發生和我需要什麼變化獲得字符串世界出來的。非常感謝您的幫助 –

0

使用-[NSData bytes],以獲得一個指向的內容。然後使用指針算法迭代字節,直到找到所需的內容。既然你想逐字節地去,你應該把指針bytes返回到uint8_t*。然後,pointer[0]指向第一個字節,pointer[1]指向第二個,依此類推。

+0

我試過了,但是當我嘗試比較指針[0]與標籤[0]比較時,我收到了一個編譯器錯誤。而(指針[0]!=標籤[0]){} – EZFrag

+0

它抱怨我比較反對無效常量 – EZFrag

+0

作爲OLE提出了無效常量,聲明你的三分球一個'uint8_t *'所以,當你解引用他們,你會得到每個字節的8位無符號整數值。 –