【问题标题】:NSData subStringFromIndex: EquivalentNSData subStringFromIndex:等效
【发布时间】:2013-07-17 18:05:57
【问题描述】:

我收到了至少 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 位。有没有人有例子或知道最好的方法?

【问题讨论】:

    标签: objective-c nsdata trim


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢。是的,我在那里放了几个条件以防止崩溃,但肯定是在那些之前!再次感谢。
    【解决方案2】:

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

    您收到的字符串被编码为 NSData。根据编码,每个字符将表示为一个或多个字节。如果是 UTF8 编码,有些字符会用一个字节表示,而另一些字符会用两个或更多字节表示。

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

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

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

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

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

    【讨论】:

    • 好人,非常感谢您的意见。让我快速尝试一下...
    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    相关资源
    最近更新 更多