为什么不将NSData中的工作转换为String? 迅速
我有那个代码
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 }
有时,将NSData
为String
不起作用。 当我print(str)
我看到nil
。 为什么会这样? 我使用GitHub的SwiftSocket库。 对不起我的英语不好。
当我的服务器发送大JSON
字符串时会发生这种情况。 例如 – 如果我收到一个消息对象(我的class级) – 一切都会有效。 但是,如果我收到4,5,6,…消息的对象(我的class级) – 这有时是有效的。 魔法 :(
新版代码
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 }
注意:我不会说斯威夫特。 以下代码可能无法编译,但它应该为您提供其背后的主要思想/逻辑。
问题是因为NSData
不完整(你一块接收它们,缓冲区大小可能不足以立即处理完整的响应),假设字节根据所使用的编码真的可以转换为NSString
,如@zaph指出。 简单示例:例如,使用UIImageJPEGRepresentation()
将UIImage
转换为NSData
,并尝试使用所需编码将其转换为NSString
,它可能无效,或者对video流执行相同操作。
我们案例的一个例子:
完全有效的“字符”:“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)
最后,只需将finalData
转换为String
:
if let str = String(data:finalData, encoding: NSUTF8StringEncoding) { response = str }
回答:“有时,将NSData转换为String不起作用。”
并非所有数据都可以转换为特定的字符串编码。 在这种情况下:
var str = String.init(data: bytes, encoding: NSUTF8StringEncoding)
有大量字节和字节序列没有有效的UTF-8字符编码。
检查的一些可能性包括数据是否实际包含任何字节,以及它是否实际上是有效的UTF-8字符串。 假设这是您正在处理的http请求/响应,请检查Content-type
,特别是charset
属性。 如果数据编码为文本以外的其他内容,或者不是UTF-8格式,则不会转换为字符串。