J'utilise la bibliothèque CocoaAsyncSocket dans mon application iOS Swift. J'ai créé un socket UDP asynchrone sur un serveur UDP de mon réseau, et il renvoie une réponse.Récupération d'une chaîne à partir d'un message de serveur UDP
Je lis cette réponse comme ceci:
func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) {
println("didReceiveData")
let data = address
var host: NSString?
var port1: UInt16 = 0
GCDAsyncUdpSocket.getHost(&host, port: &port1, fromAddress: address)
println("From \(host!)")
let gotdata = NSString(data: data, encoding: NSASCIIStringEncoding)
//let gotdata: NSString = NSString(data: data, encoding: NSUTF8StringEncoding)
println(gotdata)
}
Ceci est le résultat:
didReceiveData
From 192.168.1.114
wþÀ¨r
Comme vous pouvez le voir, il y a un tas de personnages étranges. Les données brutes sont <100277fe c0a80172 00000000 00000000>
(en écrivant println(data)
). Ici les 4 premiers octets semblent être la partie wþÀ¨r
, et les 4 suivants sont l'adresse IP, que j'ai déjà récupérée depuis la fonction getHost()
.
Je n'arrive pas à trouver de fonction d'assistance pour extraire les données réelles reçues par le serveur UDP. Je sais que la représentation ASCII de la réponse UDP est "bonjour". Cependant, si je change cela en quelque chose d'autre, cela ne se reflète pas dans les données que je vois dans la partie de débogage de Xcode. C'est toujourswþÀ¨r
.
J'ai essayé les deux avec NSASCIIStringEncoding
et NSUTF8StringEncoding
, mais ce dernier entraîne une exception d'exécution EXC_BAD_ACCESS
.
Pour autant que je pouvais trouver, c'est comment les gens normalement le faire en Objective-C (dans la fonction didReceiveData
):
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
Comment puis-je trouver le message « bonjour » dans la réponse UDP comme une représentation de chaîne?
Le! En fait un optionnel avec un déballage implicite. Pensez que vous devrez peut-être le rétrograder à NSData. Utilisant inline down casting "comme?" et affecter à la variable locale avant utilisation. – casillic