我有那段代码
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,...消息的对象(我的班级) - 这有时是有效的。魔术师:(
新版代码
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
}
答案 0 :(得分:1)
检查的一些可能性包括数据是否实际包含任何字节,以及它是否实际上是有效的UTF-8字符串。假设这是您正在处理的http请求/响应,请检查Content-type
,特别是charset
属性。如果数据编码为文本以外的其他内容,或者不是UTF-8格式,则不会转换为字符串。
答案 1 :(得分:1)
回答:"有时,将NSData转换为字符串不起作用。"
并非所有数据都可转换为特定的字符串编码。在这种情况下:
var str = String.init(data: bytes, encoding: NSUTF8StringEncoding)
有大量字节和字节序列没有有效的UTF-8字符编码。
答案 2 :(得分:1)
注意:我不会说斯威夫特。以下代码可能无法编译,但它应该为您提供其背后的主要思想/逻辑。
问题是因为NSData
不完整(你一块接收它们,缓冲区大小可能不足以立即处理完整的响应),假设字节真的可以转换为{{1根据所使用的编码,@zaph指出。
简单示例:例如,使用NSString
将UIImage
转换为NSData
,并尝试使用所需的编码将其转换为UIImageJPEGRepresentation()
,它可能无效,或者执行与视频流相同。
我们案例的一个例子:
完全有效的“字符”:“1001”,没有“10”和“01”
你只收到“10”。如果将其转换为NSString
,则为零,因为它无效
然后,您收到“01”。如果将其转换为NSString
,则为零,因为它无效
因此,在将其转换为NSString
之前,您必须阅读所有NSData
。
因此,在开始时,您可以创建NSString
然后,每次读取缓冲区时,请执行以下操作:
var finalData = NSMutableData.init()
最后,只需将var partialData = NSData.init(bytes: data, length: data.count)
finalData.appendData(partialData)
转换为finalData
:
String