web-dev-qa-db-ja.com

InputStreamをDataオブジェクトに読み込む

Swift 3.xでは、通常、Dataを使用してバイナリデータを処理します。そこから、他のほとんどの重要な型を生成でき、便利な関数があります。

しかし、どうすればDataからInputStreamを作成できますか?いい方法はありますか?

6
Raphael

いい方法が見つかりませんでした。安全でないものの周りに素敵なラッパーを作成できます。

extension Data {
    init(reading input: InputStream) throws {
        self.init()
        input.open()
        defer {
            input.close()
        }

        let bufferSize = 1024
        let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
        defer {
            buffer.deallocate()
        }
        while input.hasBytesAvailable {
            let read = input.read(buffer, maxLength: bufferSize)
            if read < 0 {
                //Stream error occured
                throw input.streamError!
            } else if read == 0 {
                //EOF
                break
            }
            self.append(buffer, count: read)
        }
    }
}

これはSwift 5. test(およびストリームの一部のみを読み取るバリアント)で完全なコードを検索するためのものです) ここ

14
Raphael

コードの上では、無限ループになる可能性があります。 httpbodyInpustreamをデータに変換すると、それが起こりました。だから私は条件を追加します。

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
nelsonK