【问题标题】:NSString from NSData is nil来自 NSData 的 NSString 为 nil
【发布时间】:2014-04-21 20:24:21
【问题描述】:

我尝试从 NSData 获取 NSString 但我得到一个 nil 值。 这是我的代码:

NSString *dataString = [[NSString alloc] initWithData:self.message.data encoding:NSUTF8StringEncoding];

当我登录 self.message.data 时,我得到:

Printing description of self->_message->_data:
<OS_dispatch_data: data[0x17e48290] = { leaf, size = 331233, buf = 0x3aac000 }>

这意味着我的数据不是零……

谁能帮忙?

【问题讨论】:

  • 这些数据来自哪里,以什么格式发送?
  • NSLog(@"Class of self-&gt;_message-&gt;_data: %@", NSStringFromClass([self-&gt;_message-&gt;_data class]));会输出什么?
  • initWithData:encoding: 方法需要一个 NSData 对象。你的self.message.data 对象是什么?
  • 有趣的是,这个OS_dispatch_data 周围还有另一个question! (不是我说这是重复的!)
  • 刚刚注意到我的数据不像我想象的那样是常规的 NSData。它是 OS_Dispatch_Data。这是什么?

标签: ios objective-c grand-central-dispatch nsdata dispatch


【解决方案1】:

在 cmets 中回答您的问题: OS_dispatch_datadispatch_data_t 在 iOS 7 和 Mavericks 上与 NSData 有免费桥接。您可以简单地将其转换为NSData *

所以,在你的情况下,你可以写:

NSData *dataCast = self.message.data;
NSString *dataString = [[NSString alloc] initWithData:dataCast encoding:NSUTF8StringEncoding];

现在你得到了正确的字符串!

在我的例子中,当 AFNetworking 将内部 NSMutableData 转换为 NSData 时,它出现了。

这个简单的演员阵容对我有帮助。


UPD: 正如 @Daij-Djan 所述:如果不起作用 - 请尝试检查您的文本编码。

例如,如果您正在使用NSURLSessionTask

NSURLSessionTask *task; // Your NSURLSessionTask
NSString *encoding = [[task response] textEncodingName];

在您的情况下 (NSUTF8StringEncoding) 应该是 "utf-8"

【讨论】:

  • 如果文本的编码是UTF8
  • @Daij-Djan 当然。但问题是如何将OS_dispatch_data 转换为NSData。而且我相信我们知道我们使用的编码。
  • 问题是“来自 NSData 的 NSString 为零”——“我们知道”是什么意思
  • 顺便说一句,我投了你一票,因为你终于写到调度数据只是 NSData 的内部表示 - cmets 很奇怪 :)
  • 虽然您提供的代码是 100% 的操作代码,我猜它是编码
【解决方案2】:

改用 UTF-16 编码。如果其中的任何数据无法识别,则转换为 UTF-8 可能会出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多