2013-07-17 16 views
0

我收到一个至少包含50个字符的NSData字符流。通常,我会尝试将其转换为NSString并使用subStringFromIndex:选择器,但似乎NSString是NULL终止(纠正我,如果我错了),我宁愿跳过数据/字符串转换。有谁知道是否有办法在NSData的特定索引处获取文件?例如,假设返回的数据是:NSData subStringFromIndex:等效

<12345678 9abcdefg hjiklmno> 

假设我想让7和8出来,而只有这两个人。为了获得7和8,我试图尝试这样的事情:

NSData *dataTrimmed = [data subdataWithRange:NSMakeRange(7, -19)]; 

工程就像一个魅力。但问题是,这个流总是会有不同的长度。它可以是100个字符,也可以是50个,但我总是知道我需要的两个值位于第42和第43个位置。有没有人有一个例子或知道最好的方法来做到这一点?

回答

2

我不知道你的代码与负长度不会崩溃。

为了让两个字节位置42,43,只是用

NSData *dataTrimmed = [data subdataWithRange:NSMakeRange(42, 2)]; 
+0

非常感谢。是的,我在那里放了一些条件来防止崩溃,但它肯定是在这些之前!再次感谢。 – John

+0

@约翰:不客气! –

1

为什么你想跳过转换的NSString?

您收到的字符串被编码为NSData。根据编码,每个字符将表示为一个或多个字节。如果是UTF8编码,则某些字符将表示为一个字节,而其他字符将由两个或更多字节表示。

因为这个原因,如果你希望你的代码是健壮的,并且处理不同的编码和不同的字符串内容,你应该先将你的NSData转换成一个NSString,然后索引这个字符串。

如果字符串是UTF-8编码,你可以做到以下几点:

NSData *data = ... 
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
NSString *subString = [str substringFromIndex:... 

在我看来,它才有意义跳过如果您收到大量的数据转换成的NSString和您可以控制编码以及您收到的字符串数据的内容。俗话说:不成熟的优化是万恶之源。

+0

伟大的点人,非常感谢输入。让我快速地给出这个镜头...... – John