2012-06-12 82 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位无符号整数值。 –