2015-10-29 84 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