【问题标题】:How do I convert an NSString value to NSData?如何将 NSString 值转换为 NSData?
【发布时间】:2011-05-08 00:49:20
【问题描述】:

如何将NSString 值转换为NSData

【问题讨论】:

    标签: ios objective-c nsstring nsdata


    【解决方案1】:
    NSString* str = @"teststring";
    NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
    

    【讨论】:

    • 与 UTF-16 或 UTF-32 等更高级别的东西相比,使用 UTF-8 的优缺点是什么?
    • NSData 不太关心是 UTF-8 还是 UTF-16 还是 UTF-32。有两个问题:一、UTF-16和UTF-32需要有正确的字节顺序。第二,将它转换回 NSString* 的人必须知道编码,并且通常会假设 UTF-8 编码。一般来说,UTF-8 最有可能被正确处理。
    • @bendytree 实际上不,它没有, -dataUsingEncoding: 将返回一个非空终止的字符串,这是 stringWithUTF8String: 要求的,你必须读取你不想要的内存。将它转换回来的是:-initWithData:encoding:.
    • @Albert Renshaw 目前(不保证会保持这种状态)NSString 在内部使用 UTF-16,因此可能会有轻微的性能提升,因为它不必执行 UTF-16 UTF-8 转换。就个人而言,我们更喜欢(正如@gnasher729 建议的那样)稳健性而不是性能,并且在任何地方都使用 UTF-8。
    • macOS 和我的应用程序没有在 big endian cpus 上运行,所以我更喜欢 utf16。
    【解决方案2】:
    NSString *str = @"helowrld";
    // This converts the string to an NSData object
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    

    你可以参考这个link

    【讨论】:

    • 一个班轮解决方案:NSData *data = [@"helowrld" dataUsingEncoding:NSUTF8StringEncoding];
    【解决方案3】:

    做:

    NSData *data = [yourString dataUsingEncoding:NSUTF8StringEncoding];
    

    然后随时继续使用NSJSONSerialization:JSONObjectWithData


    更正关于 NULL 终止符的答案

    根据 cmets、官方文档和 verifications,此答案已更新,涉及删除所谓的 NULL 终止符:

    1. dataUsingEncoding: 所记录:

      返回值

      以 NO 作为第二个参数调用dataUsingEncoding:allowLossyConversion: 的结果

    2. getCString:maxLength:encoding:cStringUsingEncoding: 所述:

      请注意,dataUsingEncoding:allowLossyConversion: 返回的数据不是严格的 C 字符串,因为它没有 NULL 终止符

    【讨论】:

    • 这是错误的!请在此处查看我的帖子:stackoverflow.com/q/14087094/192819
    • 是的。 dataUsingEncoding: 不返回以空值结尾的数据。只有 UTF8String 和其他返回 C 字符串的方法会返回以 null 结尾的字符串。
    • @PeterHosey 你有这方面的资料吗?我很难在任何文档中找到这一点。
    • 感谢@PeterHosey,您在此处链接的文档确实明确指出缺少 NULL 终止 -- (note that the data returned by dataUsingEncoding:allowLossyConversion: is not a strict C-string since it does not have a NULL terminator)。我之前一定错过了这个。不过,我一定会写下任何东西。
    • (对于任何想知道的人:shortstuffsushi 的报价在cStringUsingEncoding: 下。我在dataUsingEncoding: 下查找。)
    【解决方案4】:

    如果 Swift Developer 来到这里,

    从 NSString / String 转换为 NSData

    var _nsdata = _nsstring.dataUsingEncoding(NSUTF8StringEncoding)
    

    【讨论】:

      【解决方案5】:

      目标-C:

      NSString *str = @"test string";
      NSData *data = [NSKeyedArchiver archivedDataWithRootObject:str];
      NSString *thatStr = [NSKeyedUnarchiver unarchiveObjectWithData:data];
      

      斯威夫特:

      let str = "test string"
      let data = NSKeyedArchiver.archivedData(withRootObject: str)
      let thatStr = NSKeyedUnarchiver.unarchiveObject(with: data) as! String
      

      【讨论】:

      • 与其他方法相比可能需要大量处理器,但如果您要访问文件系统以实现持久性,则非常有用
      【解决方案6】:

      首先,您应该使用dataUsingEncoding: 而不是通过UTF8String。仅当您需要该编码中的 C 字符串时,才使用 UTF8String

      然后,对于UTF-16,只需在您的dataUsingEncoding: 消息中传递NSUnicodeStringEncoding 而不是NSUTF8StringEncoding

      【讨论】:

        【解决方案7】:

        对于 Swift 3,您将主要从 String 转换为 Data

        let myString = "test"
        let myData = myString.data(using: .utf8)
        print(myData) // Optional(Data)
        

        【讨论】:

          【解决方案8】:
          NSString *str = @"hello";
          NSData *data = [NSData dataWithBytes:str.UTF8String length:str.length];
          

          【讨论】:

          • str 包含大于127 的代码点时,此答案是错误的。这是因为str.length 给出的是Unicode 字符数,而不是字节数。例如,如果str@"にほんご",则str.length 给出4 而str.UTF8String 实际上包含12 个字节。即使将str.length替换为strlen(str.UTF8String),对于str包含NULL字符的情况,如@"にほ\0んご",还是会出错。
          • 以这种方式创建的 NSData 对象在与 [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error] 一起使用时会抛出异常;
          【解决方案9】:

          目标-C:

          NSString 到 NSData:

          NSString* str= @"string";
          NSData* data=[str dataUsingEncoding:NSUTF8StringEncoding];
          

          NSData 到 NSString:

          NSString* newStr = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
          

          斯威夫特:

          字符串到数据:

          var testString = "string"
          var somedata = testString.data(using: String.Encoding.utf8)
          

          数据转字符串:

          var backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String!
          

          【讨论】:

            【解决方案10】:

            更新 Swift 5.x

            let str = "teststring"
            let data = str.data(using: .utf8)
            

            【讨论】:

              【解决方案11】:

              斯威夫特:

              斯威夫特 5.x

              let myStringToConvert = "My String to Convert in Data"
              let myData = str.data(using: .utf8)
              

              字符串到数据:

              var myStringToConvert = "My String to Convert in Data"
              var myData = testString.data(using: String.Encoding.utf8)
              

              数据转字符串:

              var backToMyString = String(data: myData!, encoding: String.Encoding.utf8) as String!
              

              目标 C:

              NSString 到 NSData:

              NSString* myStringToConvert= @"My String to Convert in Data";
              NSData* myData=[str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
              

              NSData 到 NSString :

              NSString* backToMyString = [[NSString alloc] initWithData: myData encoding:NSUTF8StringEncoding];
              

              【讨论】:

                【解决方案12】:
                NSString *str = @"Banana";
                NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
                

                【讨论】:

                  【解决方案13】:

                  目标-C

                  NSString *str = @"Hello World";
                  NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
                  

                  斯威夫特

                  let str = "Hello World"
                  let data = string.data(using: String.Encoding.utf8, allowLossyConversion: false)
                  

                  【讨论】:

                    【解决方案14】:

                    在 Swift 中有一个 API,它返回一个 非可选

                    let str = "teststring"
                    let data = Data(str.utf8)
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2010-11-20
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多