0

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

<12345678 9abcdefg hjiklmno>

可以说我想把 7 和 8 拿出来,只有这两个。为了获得 7 和 8,我已经考虑尝试这样的事情:

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

奇迹般有效。但问题是,流总是会有不同的长度。它可能是 100 个字符,也可能是 50 个字符,但我始终知道我需要的两个值位于第 42 和 43 位。有没有人有一个例子或知道最好的方法?

4

2 回答 2

2

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

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

NSData *dataTrimmed = [data subdataWithRange:NSMakeRange(42, 2)];
于 2013-07-17T18:41:35.747 回答
1

为什么要跳过到 NSString 的转换?

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

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

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

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

在我看来,只有在收到大量数据并且控制编码和收到的字符串数据的内容时,跳过转换为 NSString 才有意义。

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

于 2013-07-17T19:18:34.483 回答