2015-10-29 30 views
8

[String] 'i BLE Connection için NSData'ya dönüştürmek istiyorum.Dize Dizisi NSData, Dize Dizisine NSData Dönüştürme

Dize için NSData/NSData/String dönüştürmeyi biliyorum. > NSData ben [dize] dönüştürmek istediğiniz https://gist.github.com/nolili/2bf1a701df1015ed6488

< - Ben dönüştürmek nasıl Ancak

// 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"] 

Bu [Uint8] < dönüştürme bir örnek -> NSData

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

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

cevap

9

Sorunuza doğrudan bir yanıt olarak, dizinizdeki her dizeyi thisString.dataUsingEncoding(_:) için sorabilir ve sonucu tamamlanana kadar sonucu bir NSMutableData örneğine ekleyebilirsiniz. Daha sonra dizeleri ayırmak istiyorsanız bu size yardımcı olmuyor Tabii

let stringsData = NSMutableData() 
for string in strings { 

    if let stringData = string.dataUsingEncoding(NSUTF16StringEncoding) { 

     stringsData.appendData(stringData) 

    } else { 

     NSLog("Uh oh, trouble!") 

    } 

} 

, bu yüzden gerçekten bilmeniz gereken ortam ne sen diğer ucunda bu verileri tüketmek niyetinde nasıl/aşağıdadır bağ? Diğer ucu da Kakao kullanıyorsa, sadece bir PLIST olarak ambalajlamayı düşünün. NSString, NSArray ve NSData tüm özellik listesi türleri olduğundan, sadece NSArray NSString örnekleri doğrudan arşivleyebilirsiniz:

let arrayAsPLISTData = NSKeyedArchiver.archivedDataWithRootObject(strings) 

... daha sonra Kakao farkında hedef ve elde edilen NSData örneği aktarmak:

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

    // ... do something 

} 
+0

9 Cevabınız için teşekkür ederiz iOS bu test edilmiş ve özür dilerim geç cevap ... [String] 'i BLE bağlantısı üzerinden başka bir cihaza göndermek istiyorum. BLE üzerinden bir şey gönderdiğimizde "writeValue" yöntemini kullanıyoruz. peripherl.writeValue (data: NSData, forCharacteristic: characteristic, type: * responce type *). – ketancho

+0

NSKeyedUnarchiver kullandım, işe yarıyor! Çok teşekkür ederim. Ancak, BLE Bağlantısı aracılığıyla msg gönderirken NSData dönüştürmek için en iyi yol olduğunu bilmiyorum. – ketancho

+0

Bu hala soruma cevap vermiyor. Ne * tam * bu veriler ile BLE cihazı yapıyor? Bu veri dizelerini hangi programlama ortamıyla kullanıyorsunuz? Bu, sorunuzu nasıl kullanacağınız konusunda nasıl cevaplayacağınızı bile bilmemiz gerektiğini bilmemiz gereken hayati bir bilgidir. –

5

Ben

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

Teşekkür ederim Robert ve üzgünüm geç cevabım. kodunuz aynı zamanda env'de de çalıştı. çok teşekkür ederim. – ketancho

+0

Hoşgeldiniz, @ketancho, Cevap olarak işaretlemek için yeterince iyi mi? (Benim ilk :-) olurdum) – Verticon