Swift 3.x에서 우리는 보통 Data
을 사용하여 이진 데이터를 처리합니다. 그것에서 당신은 대부분의 다른 중요한 유형을 생성 할 수 있고, 거기에 유용한 기능이 있습니다.데이터 객체의 InputStream 읽기
그러나 InputStream
에서 Data
을 어떻게 만듭니 니? 좋은 방법이 있습니까?
Swift 3.x에서 우리는 보통 Data
을 사용하여 이진 데이터를 처리합니다. 그것에서 당신은 대부분의 다른 중요한 유형을 생성 할 수 있고, 거기에 유용한 기능이 있습니다.데이터 객체의 InputStream 읽기
그러나 InputStream
에서 Data
을 어떻게 만듭니 니? 좋은 방법이 있습니까?
좋은 방법을 찾을 수 없습니다. 우리는 안전하지 않은 물건 주위에 좋은 틱 래퍼를 만들 수 있습니다
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()
}
}
테스트
here으로 전체 코드를 찾을 수 있습니다.
위의 코드는 무한 루프가 될 수 있습니다. 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()
}
}
해당 스트림과 같은 소리가 들리지 않습니다. 'hasBytesAvailable'은'false'를 리턴해야합니다. 그렇지 않습니까? 'hasBytesAvailable == true'의 의미가 무엇인지 모르지만'read == 0'은 그렇습니다; 나에게 오류 시나리오처럼 들린다. – Raphael
@Raphael'InputStream.read (_ buffer : UnsafeMutablePointer, maxLength len : Int) -> Int'는 에러가 있으면'-1'을, 더 이상 읽을 것이 없다면'0'을,'> 1'을 반환합니다 if 읽을 바이트가 남아 있습니다. –
Andreas