如何将字符串数组转换为NSData,NSData转换为字符串数组?

ket*_*cho 10 swift

我想将[String]转换为NSData以进行BLE连接.

我知道如何将String转换为NSData/NSData为String.

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

// NSData -> String
var outStr: String = NSString(data:data, encoding:NSUTF8StringEncoding) as! String
Run Code Online (Sandbox Code Playgroud)

但是,我该如何转换,,

// [String] -> NSData ???
let strs: [String] = ["Apple", "Orange"]
Run Code Online (Sandbox Code Playgroud)

这是转换[UInt8] < - > NSData https://gist.github.com/nolili/2bf1a701df1015ed6488的示例

我想转换[String] < - > NSData

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

// NSData -> [String] ... please teach me..
Run Code Online (Sandbox Code Playgroud)

小智 17

斯威夫特 4.2

[String]-> JSON->Data

func stringArrayToData(stringArray: [String]) -> Data? {
  return try? JSONSerialization.data(withJSONObject: stringArray, options: [])
}
Run Code Online (Sandbox Code Playgroud)

Data-> JSON->[String]

func dataToStringArray(data: Data) -> [String]? {
  return (try? JSONSerialization.jsonObject(with: data, options: [])) as? [String]
}
Run Code Online (Sandbox Code Playgroud)


Jos*_*zzi 10

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

let stringsData = NSMutableData()
for string in strings {

    if let stringData = string.dataUsingEncoding(NSUTF16StringEncoding) {

        stringsData.appendData(stringData)

    } else {

        NSLog("Uh oh, trouble!")

    }

}
Run Code Online (Sandbox Code Playgroud)

当然,如果你想稍后分离字符串,这对你没有帮助,所以我们真正需要知道的是你打算在什么环境中在连接的另一端使用这些数据?如果另一端也使用Cocoa,请考虑将其打包为PLIST.由于NSString,NSArrayNSData都是属性列表类型,您可以直接归档您NSArrayNSString实例:

let arrayAsPLISTData = NSKeyedArchiver.archivedDataWithRootObject(strings)
Run Code Online (Sandbox Code Playgroud)

...然后将生成的NSData实例传输到Cocoa感知目标,然后:

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

    // ... do something

}
Run Code Online (Sandbox Code Playgroud)


Ver*_*con 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
}
Run Code Online (Sandbox Code Playgroud)