NSData subStringFromIndex:等效

时间:2013-07-17 18:05:57

标签: objective-c nsdata trim

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

<12345678 9abcdefg hjiklmno>

让我们说我想把7和8拿出来,只有那两个人。为了获得7和8,我试着尝试这样的事情:

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

像魅力一样工作。但问题是,流总是不同的长度。它可能是100个字符,也可能是50个,但我总是知道我需要的两个值位于第42和第43位。有没有人有一个例子或知道最好的方法呢?

2 个答案:

答案 0 :(得分:2)

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

要获得位置42,43的两个字节,只需使用

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

答案 1 :(得分:1)

为什么要跳过转换为NSString?

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

因此,如果您希望代码具有健壮性并处理不同的编码和不同的字符串内容,则应首先将NSData转换为NSString,然后索引字符串。

如果您的字符串是UTF-8编码,您可以执行以下操作:

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

在我看来,如果你收到大量数据并且你控制了编码和你收到的字符串数据的内容,那么跳过转换为NSString是有意义的。

俗话说:过早优化是万恶之源。