Я использую библиотеку CocoaAsyncSocket в моем приложении iOS на основе Swift. Я создал асинхронный UDP-сокет для UDP-сервера в своей сети, и он отправляет ответ.Извлечение строки из сообщения UDP-сервера
Я читаю этот ответ так:
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)
}
Это результат:
didReceiveData
From 192.168.1.114
wþÀ¨r
Как вы можете видеть, это куча странных персонажей.
Исходные данные <100277fe c0a80172 00000000 00000000>
(путем написания println(data)
). Здесь первые 4 байта представляют собой часть wþÀ¨r
, а следующие 4 - это IP-адрес, который я уже извлек из функции getHost()
.
Я не могу найти какую-либо вспомогательную функцию для извлечения фактических данных, полученных UDP-сервером. Я знаю, что представление ASCII ответа UDP «привет». Однако, если я изменю это на что-то еще, это не отразится на данных, которые я вижу в части отладки Xcode. Это всегдаwþÀ¨r
.
Я пробовал оба с NSASCIIStringEncoding
и NSUTF8StringEncoding
, но последний приводит к исключению времени выполнения EXC_BAD_ACCESS
.
Насколько я мог найти, это то, как люди обычно делают это в Objective-C (внутри функции didReceiveData
):
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
Как найти сообщение «привет» в UDP ответ как строковое представление?
The! делает его необязательным с неявной разверткой. Думайте, что вам может понадобиться понизить его до NSData. Использование встроенного литья «как?» и назначить локальную переменную перед использованием. – casillic