2017-03-02 1 views
3

In Swift 3.x verarbeiten wir normalerweise binäre Daten unter Verwendung von Data; Daraus können Sie die meisten anderen wichtigen Typen erzeugen, und es gibt nützliche Funktionen darauf.Lesen eines InputStream in ein Datenobjekt

Aber wie erstelle ich einen Data von einem ? Gibt es einen schönen Weg?

Antwort

6

Ich konnte keinen schönen Weg finden. Wir können einen schönen-ish-Wrapper um die unsicheren Sachen schaffen:

extension Data { 
    init(reading input: InputStream) { 
     self.init() 
     input.open() 

     let bufferSize = 1024 
     let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize) 
     while input.hasBytesAvailable { 
      let read = input.read(buffer, maxLength: bufferSize) 
      self.append(buffer, count: read) 
     } 
     buffer.deallocate(capacity: bufferSize) 

     input.close() 
    } 
} 

Finden vollständigen Code mit Test here.

0

über dem Code, kann es Endlosschleife sein. Wenn ich httpbodyInpustream in Daten konvertiere, ist es passiert. Also füge ich eine Bedingung hinzu.

extension Data { 
    init(reading input: InputStream) { 
     self.init() 
     input.open() 

     let bufferSize = 1024 
     let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize) 
     while input.hasBytesAvailable { 
      let read = input.read(buffer, maxLength: bufferSize) 
      if (read == 0) { 
       break // added 
      } 
      self.append(buffer, count: read) 
     } 
     buffer.deallocate(capacity: bufferSize) 

     input.close() 
    } 
} 
+0

Klingt wie dieser Strom ist kaputt; 'hasBytesAvailable' sollte' false' zurückgeben, oder? Nicht sicher, was die Semantik von 'hasBytesAvailable == true' ist, aber' read == 0' ist; klingt für mich wie ein Fehlerszenario. – Raphael

+0

@Raphael 'InputStream.read (_ Puffer: UnsafeMutablePointer , maxLength len: Int) -> Int' gibt' -1', wenn ein Fehler war, '0', wenn es nicht mehr zu lesen ist, und '> 1 ', wenn Es sind noch Bytes zum Lesen vorhanden. – Andreas

Verwandte Themen