2015-08-11 2 views
0

Je n'arrive pas à convertir des chaînes de et vers UnsafeMutablePointers. Le code suivant ne fonctionne pas, renvoyant la mauvaise chaîne.Codage et décodage de chaînes à l'aide de UnsafeMutablePointer dans Swift

// func rfcommChannelData(rfcommChannel: IOBluetoothRFCOMMChannel!, data dataPointer: UnsafeMutablePointer<Void>, length dataLength: Int) 
func receivingData(data dataPointer: UnsafeMutablePointer<Void>, length dataLength: Int) { 
    let data = NSData(bytes: dataPointer, length: dataLength) 
    println("str = \(NSString(data: data, encoding: NSASCIIStringEncoding))") 
} 

// - (IOReturn)writeSync:(void *)data length:(UInt16)length; 
func sendingData(data: UnsafeMutablePointer<Void>, length: UInt16) { 
    receivingData(data: data, length: Int(length)) 
} 


var str: NSString = "Hello, playground" 
var data = str.dataUsingEncoding(NSASCIIStringEncoding)! 
var bytes = data.bytes 

sendingData(&bytes, UInt16(data.length)) 

Un lien vers le fichier de terrain de jeu est here. Si quelqu'un a l'habitude d'utiliser UnsafeMutablePointers dans Swift pour les chaînes, j'apprécierais beaucoup d'être guidé car je n'ai fait aucun progrès ces derniers jours. Merci encore!

Répondre

0

Avec

var bytes = data.bytes 
sendingData(&bytes, UInt16(data.length)) 

vous passez l'adresse elle-même la bytes variable à la fonction, donc ce que vous voyez est les octets qui sont utilisés pour représenter ce pointeur.

Qu'est-ce que vous voulez sans doute est

let str = "Hello, playground" 
let data = str.dataUsingEncoding(NSASCIIStringEncoding)! 
sendingData(UnsafeMutablePointer(data.bytes), UInt16(data.length)) 

pour passer le pointeur sur les octets de données.

Vous devriez également envisager d'utiliser NSUTF8StringEncoding au lieu, parce qu'une conversion NSASCIIStringEncoding peut échouer.

+0

Merci beaucoup! Cela a fonctionné parfaitement! – user2844801