2017-10-25 20 views
0

私はストリームクラスを使用してソケットからデータを取得するアプリケーションを持っています。InputStreamからデータを取得

すべてが期待どおりに動作するように見える、私は、デリゲートメソッドでデータを受信して​​います:

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

私が午前の課題は、有用な情報にデータを変換しています。 ByteBufferを使って達成しようとしていることをするAndroidアプリがあります。

ByteBufferは、4の間隔でデータを反復処理し、getFloatおよびgetIntのようなメソッドを使用して、必要なデータ型に解析します。

基本的には、InputStreamデータをループして、ストリーム内のすべての値を取得します。各値は常に4バイトの長さです。

Swift 3を使用してこれを行うにはどうすればよいですか?

答えて

1

私はそれを働かせました。他の誰かが同様のことをする必要がある場合は、ここに私のコードがあります:

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 
     } 
    } ... 
関連する問題