为什么不将工作从 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,...消息对象(我的类) - 这有时是有效的。魔术:(
新版本代码

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 ,它是 nil,因为它无效。
然后,您会收到"01"。如果你把它转换成 NSString ,它是 nil,因为它无效。
因此,在将其转换为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 转换为字符串不起作用。
并非所有数据都可以转换为特定的字符串编码。在这种情况下:

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

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

要检查的一些可能性包括数据是否实际包含任何字节,以及它是否实际上是有效的 UTF-8 字符串。假设这是您正在处理的 http 请求/响应,请检查Content-type,特别是 charset 属性。如果数据被编码为文本以外的内容,或者它不是 UTF-8 格式,它不会转换为字符串。

最新更新