2017-10-25 6 views
0

Ich habe eine App, die Daten aus einem Socket mithilfe der Stream-Klasse abruft.Abrufen von Daten aus InputStream

Alles scheint wie erwartet zu arbeiten, ich Daten in der Delegatmethode empfange:

func stream(_ Stream: Stream, handle eventCode: Stream.Event)

Die Herausforderung, die ich die Daten in nützliche Informationen konvertiert habe. Es gibt eine Android-App, die das tut, was ich mit einem ByteBuffer erreichen möchte.

Diese ByteBuffer durchläuft die Daten in Intervallen von 4 und analysiert die Daten in die erforderlichen Datentypen mit Methoden wie getFloat und getInt.

Grundsätzlich möchte ich die InputStream-Daten durchlaufen und alle Werte im Stream abrufen. Jeder Wert ist immer 4 Byte lang.

Wie kann ich dies mit Swift 3 machen?

Antwort

1

Ich habe es funktioniert. Wenn jemand anderes etwas Ähnliches tun möchte, hier ist mein Code:

func stream(_ aStream: Stream, handle eventCode: Stream.Event) { 

    if aStream === inputStream { 
     switch eventCode { 
     case Stream.Event.errorOccurred: 
      print("input: ErrorOccurred: \(String(describing: aStream.streamError))") 
     case Stream.Event.openCompleted: 
      print("input: OpenCompleted") 
     case Stream.Event.hasBytesAvailable: 
      print("input: HasBytesAvailable") 
      var index = 0 //this index is used to map the value from bytes below. For example, 0 is date 
      var buffer = [UInt8](repeating: 0, count: 4) //this breaks the bytes into groups of 4 bytes each 
      while (inputStream?.hasBytesAvailable)!{ 
       if let length = inputStream?.read(&buffer, maxLength: buffer.count) { 
        if(length > 0){ 
         let data = Data(bytes: buffer) 
         let UINT32 = UInt32(littleEndian: data.withUnsafeBytes { $0.pointee }) 
       let float = data.withUnsafeBytes { $0.pointee } as Float 
         let int = data.withUnsafeBytes { $0.pointee } as Int 
      //Do something with the values, map to an object, etc 
         index += 1 //increase the index to know what the next 4 bytes should be mapped as 
        } 
       } 
      } 

      break 

     default: 
      break 
     } 
    } ...