当前位置: 首页 > 面试题库 >

为什么不将工作从NSData转换为String?迅速

相德宇
2023-03-14
问题内容

我有那个代码

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
}

问题答案:

注意:我不会讲Swift。以下代码可能无法编译,但应为您提供背后的主要思想/逻辑。

问题是因为存在NSData不完整的情况(假设您确实可以NSString根据所使用的编码将字节真正转换为字节,因此您需要逐个接收它们,并且缓冲区大小可能不足以一次处理完整的响应),如@zaph所指出的那样。
。简单示例:例如,将aUIImage转换为NSData使用UIImageJPEGRepresentation(),然后尝试NSString使用所需的编码将其转换为,这可能无效,或者对视频流也是如此。

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

因此,在开始时,您可以创建一个。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
}


 类似资料:
  • 问题内容: 我最近一直在编写与iPhone交互的Web应用程序。iPhone iphone实际上将以plist的形式将信息发送到服务器。因此,看到类似…的情况并不少见。 现在,我知道此数据已以某种方式进行了哈希/加密。当我使用编辑器(“属性列表编辑器”)打开plist时,它向我展示了一种更加“易于阅读”的格式。例如,上面的数据将被转换为… 知道转换的方法是什么吗?主要是我希望将其放入Java St

  • 问题内容: 我在Swift 中将元素转换为,然后将变量转换回时遇到了问题。 首先,我想提取以下JSON数据的元素: 放入NSData 变量,但似乎无法做到这一点。我用来解析如下: 但这给了我一个ScalarNumber数组,我不知道如何存储到一个对象中。 其次,我想从同一个对象生成回来: 但是NSData 对象不会转换为[-67,51,-38,61,-72,102,48],它只是使JSON字符串无

  • 问题内容: 我正在尝试将转换为,而我的代码如下: 控制台会打印如下内容: 的是,我不知道这里有什么问题。 之后,我尝试像这样进行排序: 和控制台打印: 一切正常。 那么,有人可以告诉我我的第一个案例有什么问题吗? 问题答案: 正如Martin R所建议的,我看到了这篇文章,并将那个Objective- C代码转换为swift并且得到了以下代码: 并且这正常工作。 对于Swift 3.0:

  • 问题内容: 我发现了一些奇怪的异常: 怎么可能呢?每个对象都可以转换为String,不是吗? 代码是: 谢谢。 问题答案: 为什么这不可能: 因为String和Integer不在同一对象层次结构中。 您尝试的转换仅在相同的层次结构中有效,例如 在这种情况下,或或将起作用。 因此,正如其他人已经提到的,要将整数转换为字符串,请使用: 或对于原始 要么 为对象。

  • 问题内容: 我正在开发一些应用程序,它允许从SD卡中选择图像,将其保存到数据库中并为ImageView设置此值。我需要知道将uri转换为字符串并将字符串转换为uri的方法。现在,我使用了Uri的getEncodedPath()方法,但是例如,此代码不起作用: 因此,我不知道如何将Uri保存到数据库中并根据保存的值创建新的Uri。请帮我修复它。 问题答案: 我需要知道将uri转换为字符串并将字符串转

  • 问题内容: 如何从float转换为string或从string转换为float? 在我的情况下,我需要在2个值字符串(我从表中获得的值)和我计算出的浮点值之间进行断言。 我尝试从浮动到字符串: 但是断言失败 问题答案: 使用Java的类。 为了进行比较,将字符串转换为float并比较两个float总是更好。这是因为对于一个浮点数,存在多个字符串表示形式,与字符串相比,它们是不同的(例如“ 25”!