为什么不将工作从NSData转换为字符串?斯威夫特

问题描述:

我有一个代码为什么不将工作从NSData转换为字符串?斯威夫特

func SendRequest(request: String) -> String 
{ 
    var response = "" 
    var (success, errmsg) = client.connect(timeout: 1) 
    if success 
    { 
     var (success, errmsg) = client.send(str: request + "\n") 
     if success 
     { 
      while(true) 
      { 
       var data = client.read(10240*10) 
       if (data == nil) 
       { 
        break 
       } 
       var bytes = NSData.init(bytes: data!, length: data!.count) 
       var str = String.init(data: bytes, encoding: NSUTF8StringEncoding) 
       if str != nil{ 
       response += str! 
       } 
      } 
     } 
     else 
     { 
      print(errmsg) 
     } 
    } 
    else 
    { 
     print(errmsg) 
    } 
    return response 
} 

有时候,投NSDataString不起作用。当我print(str)我看到nil。这是为什么发生?我使用GitHub中的SwiftSocket库。对不起我的英语不好。

发生这种情况时,我的服务器发送大JSON字符串。例如 - 如果我收到一个消息对象(我的课程) - 一切都会正常工作。但是,如果我收到了4,5,6,...消息的对象(我的课程) - 这有时会起作用。 MAGIC :(
新的代码版本

func SendRequest(request: String) -> String 
{ 
    var response = "" 
    var bigData: [UInt8] = [] 
    var (success, errmsg) = client.connect(timeout: 1) 
    if success 
    { 
     var (success, errmsg) = client.send(str: request + "\n") 
     if success 
     { 
      while(true) 
      { 
       var data = client.read(1024*10) 
       if (data == nil) 
       { 
        break 

       } 
       bigData.appendContentsOf(data!) 
      } 
     } 
     else 
     { 
      print(errmsg) 
     } 
    } 
    else 
    { 
     print(errmsg) 
    } 
    var bytes = NSData.init(bytes: bigData, length: bigData.count) 

    if let str = String(data: bytes, encoding: NSUTF8StringEncoding) as String? { 
     print(str) 
     response = str 
    } 
    return response 
} 
+1

有时数据可能比一个字符串更复杂,可能需要被转换为NSArray或NSDictionary尝试添加此 – SeanLintern88

+0

我只收到来自我的服务器的JSON字符串 - 这是“比字符串更复杂”? –

+0

检查'bytes'不是'nil'。 –

注:我不会说斯威夫特。下面的代码可能无法编译,但它应该给你背后的主要思想/逻辑。

这个问题是因为NSData不完整(你一个接一个地接收它们,并且缓冲区大小可能不足以一次处理完整的响应),假设根据所使用的编码字节真的可转换为NSString@zaph所指出的那样。 简单示例:例如,使用UIImageJPEGRepresentation()UIImage转换为NSData,并尝试使用所需的编码将其转换为NSString,它可能无效,或者对视频流执行相同操作。

本例的示例:
完整有效的“字符”:“1001”,不带“10”或“01”。
您只收到“10”。如果您将其转换为NSString,则它为零,因为它无效。
然后,您收到“01”。如果您将其转换为NSString,则它为零,因为它无效。
因此,在将其转换为NSString之前,您必须先阅读所有的NSData

因此,在开始时,你可以创建一个var finalData = NSMutableData.init() 然后,每次读的缓冲时间,这样做:

var partialData = NSData.init(bytes: data, length: data.count) 
finalData.appendData(partialData) 

最后,只是变换finalDataString

if let str = String(data:finalData, encoding: NSUTF8StringEncoding) { 
    response = str 
} 

一些可能性来检查包括数据实际上是否包含任何字节,它是否真的是一个有效的UTF-8字符串。假设这是一个HTTP请求/如果数据的编码方式不是UTF-8格式,则不会转换为字符串

+0

我更新了主题。 –

回答: “有时,将NSData强制转换为字符串不起作用。”
并非所有数据都可以转换为特殊字符r字符串编码。在这种情况下:

var str = String.init(data: bytes, encoding: NSUTF8StringEncoding) 

有大量的字节和字节序列没有有效的UTF-8字符编码。