2015-10-29 80 views
8

我想将[String]转换为NSData以进行BLE连接。如何将字符串数组转换为NSData,将NSData转换为字符串数组?

我知道如何将字符串转换为NSData/NSData为字符串。

// String -> NSData 
var str: String = "Apple"; 
let data: NSData = str.dataUsingEncoding(NSUTF8StringEncoding)! 

// NSData -> String 
var outStr: String = NSString(data:data, encoding:NSUTF8StringEncoding) as! String 

但是,我怎么能转换,,

// [String] -> NSData ??? 
let strs: [String] = ["Apple", "Orange"] 

这是转换[UINT8] <的样品 - > NSData的 https://gist.github.com/nolili/2bf1a701df1015ed6488

我想转换[字符串] < - > NSData

// [String] -> NSData ??? Is it correct??? 
var strs: [String] = ["Apple", "Orange"] 
let data2 = NSData(bytes: &strs, length: strs.count) 

// NSData -> [String] ... please teach me.. 

回答

9

For直接回答您的问题,您可以询问阵列中的每个字符串是否为thisString.dataUsingEncoding(_:),并将结果附加到NSMutableData实例,直到完成所有操作。

let stringsData = NSMutableData() 
for string in strings { 

    if let stringData = string.dataUsingEncoding(NSUTF16StringEncoding) { 

     stringsData.appendData(stringData) 

    } else { 

     NSLog("Uh oh, trouble!") 

    } 

} 

当然,如果你想字符串后分开这并不能帮助你,所以我们真正需要知道的是如何/在什么样的环境,你打算消耗上的另一端这个数据您连接?如果另一端也使用Cocoa,可以考虑将它打包为PLIST。由于NSStringNSArray,并NSData都是属性列表类型,你可以存档您的NSStringNSArray情况下直接:

let arrayAsPLISTData = NSKeyedArchiver.archivedDataWithRootObject(strings) 

...然后将得到的NSData实例转移到可可感知目的地,然后:

if let newStrings: [String] = NSKeyedUnarchiver.unarchiveObjectWithData(arrayAsPLISTData) as? [String] { 

    // ... do something 

} 
+0

谢谢您的回复,对不起,我的延迟回复...我想通过BLE连接将[String]发送到其他设备。当我们通过BLE发送一些东西时,我们使用“writeValue”方法。 peripherl.writeValue(数据:NSData,forCharacteristic:特征,类型:*响应类型*)。 – ketancho

+0

我使用NSKeyedUnarchiver,它的工作原理!非常感谢你。但是,我不知道这是通过BLE连接发送消息时转换NSData的最佳方式。 – ketancho

+0

这仍然不能回答我的问题。 BLE设备处理这些数据的确切原因是什么?你使用这些字符串作为数据的编程环境/语言/设备是什么?这是我们需要知道的重要信息,甚至可以确定如何以您可以使用的方式回答您的问题。 –

5

我测试了在IOS 9

func test() { 
    let originalStrings = ["Apple", "Pear", "Orange"] 
    NSLog("Original Strings: \(originalStrings)") 

    let encodedStrings = stringArrayToNSData(originalStrings) 
    let decodedStrings = nsDataToStringArray(encodedStrings) 
    NSLog("Decoded Strings: \(decodedStrings)") 
} 

func stringArrayToNSData(array: [String]) -> NSData { 
    let data = NSMutableData() 
    let terminator = [0] 
    for string in array { 
     if let encodedString = string.dataUsingEncoding(NSUTF8StringEncoding) { 
      data.appendData(encodedString) 
      data.appendBytes(terminator, length: 1) 
     } 
     else { 
      NSLog("Cannot encode string \"\(string)\"") 
     } 
    } 
    return data 
} 

func nsDataToStringArray(data: NSData) -> [String] { 
    var decodedStrings = [String]() 

    var stringTerminatorPositions = [Int]() 

    var currentPosition = 0 
    data.enumerateByteRangesUsingBlock() { 
     buffer, range, stop in 

     let bytes = UnsafePointer<UInt8>(buffer) 
     for var i = 0; i < range.length; ++i { 
      if bytes[i] == 0 { 
       stringTerminatorPositions.append(currentPosition) 
      } 
      ++currentPosition 
     } 
    } 

    var stringStartPosition = 0 
    for stringTerminatorPosition in stringTerminatorPositions { 
     let encodedString = data.subdataWithRange(NSMakeRange(stringStartPosition, stringTerminatorPosition - stringStartPosition)) 
     let decodedString = NSString(data: encodedString, encoding: NSUTF8StringEncoding) as! String 
     decodedStrings.append(decodedString) 
     stringStartPosition = stringTerminatorPosition + 1 
    } 

    return decodedStrings 
} 
+0

谢谢罗伯特,对不起我迟到的回复。你的代码也在我的环境中工作。非常感谢你。 – ketancho

+0

欢迎您@ @ @ @ @ @ @ @ @ @ @ @ @ @,足以将它标记为答案? (这将是我的第一个:-)) – Verticon