【问题标题】:On conversion from NSString to NSData从 NSString 转换为 NSData
【发布时间】:2013-11-08 07:13:56
【问题描述】:

假设我有一些这样的字符串:

NSString *someString = @"123";

然后,我将此字符串转换为 NSData 的实例,如下所示:

NSData *someData = [NSData dataWithBytes:[someString UTF8String] length:[someString length]];

据我了解,NSData 本质上只是一个无编码的比特流。我的问题是:NSData 是否通过检查长度参数的值来确定每个 UTF8String 中有多少位?换句话说,[someString UTF8String] 返回一个包含字符“123”的 C 字符串,而 [someString length] 返回整数 3。NSData 是否理解每个字符必须由 8 位组成?我完全没有抓住重点吗?

谢谢。

【问题讨论】:

    标签: ios nsstring nsdata


    【解决方案1】:

    没有。

    + (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length
    

    这个方法只需要 2 个参数:指向内存中字节流的 void 指针,以及应该从这个字节流中将多少个字节流带入 NSData 对象的长度。这种方法和其他方法一样,不知道也不关心你是如何得到这个字节流的,当然也不知道关于 UTF8String 的任何事情,它只关心数据类型,它们是否匹配方法签名。

    正如 Matthias 解释的那样,您关于如何确定字符串长度的想法也是错误的。为此使用 strlen C 函数。此函数检查字符串终止空字符 \0。

    【讨论】:

    • 是的,我现在看到了。感谢您清除它。我已经做了大约 5 年的 iOS 开发人员,我有点尴尬,我不知道其中的区别。 :X 编辑:啊,我明白为什么我现在感到困惑了——一直以来我的印象是它是 BITS,而不是字节(对于第一个参数)——现在一切都说得通了,再次感谢。
    【解决方案2】:

    length 返回字符串的长度,如“Unicode 字符数”,它不返回其后备存储中的字节数。

    要将 NSString 转换为 NSData,您必须使用以下内容:

    NSString *someString = @"123";
    NSData *someData = [someString dataUsingEncoding:NSUTF8StringEncoding];
    

    你所做的,适用于仅包含 ASCII 的 UTF8,因为即使在 UTF8 中,ASCII 字符也只占用 1 个字节。巧合的是,字符串的“逻辑”长度与其后备存储的大小相匹配。

    尝试使用包含 ASCII 范围之外的字符的字符串,您会看到不同的结果:

    NSString *asciiString = @"123";
    NSLog(@"\"%@\" - Length: %ld", asciiString, (long)[asciiString length]);
    NSData *asciiData = [asciiString dataUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"Data length: %ld", [asciiData length]);
    
    NSString *utf8String = @"?";
    NSLog(@"\"%@\" - Length: %ld", utf8String, (long)[utf8String length]);
    NSData *utf8Data = [utf8String dataUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"Data length: %ld", [utf8Data length]);
    
    utf8String = @"oö";
    NSLog(@"\"%@\" - Length: %ld", utf8String, (long)[utf8String length]);
    utf8Data = [utf8String dataUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"Data length: %ld", [utf8Data length]);
    

    产量:

    "123" - Length: 3
    Data length: 3
    "?" - Length: 2
    Data length: 4
    "oö" - Length: 2
    Data length: 3
    

    【讨论】:

    • 你读过我写的任何东西吗?大声笑 - 请重读然后回答我的问题。附言- dataWithBytes:length: 适用于将 NSString 转换为 NSData。您的代码和我的代码产生相同的结果。 - 另外,也不是要以严厉的语气脱口而出。
    • 然后尝试使用不只包含 ASCII 的字符串
    • 啊。我懂了。好点子。不过,你能解决我的问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2012-11-09
    • 2011-11-11
    相关资源
    最近更新 更多