为什么不将工作从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
}
有时候,投NSData
到String
不起作用。当我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
}
注:我不会说斯威夫特。下面的代码可能无法编译,但它应该给你背后的主要思想/逻辑。
这个问题是因为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)
最后,只是变换finalData
到String
:
if let str = String(data:finalData, encoding: NSUTF8StringEncoding) {
response = str
}
一些可能性来检查包括数据实际上是否包含任何字节,它是否真的是一个有效的UTF-8字符串。假设这是一个HTTP请求/如果数据的编码方式不是UTF-8格式,则不会转换为字符串
我更新了主题。 –
回答: “有时,将NSData强制转换为字符串不起作用。”
并非所有数据都可以转换为特殊字符r字符串编码。在这种情况下:
var str = String.init(data: bytes, encoding: NSUTF8StringEncoding)
有大量的字节和字节序列没有有效的UTF-8字符编码。
有时数据可能比一个字符串更复杂,可能需要被转换为NSArray或NSDictionary尝试添加此 – SeanLintern88
我只收到来自我的服务器的JSON字符串 - 这是“比字符串更复杂”? –
检查'bytes'不是'nil'。 –