将UnsafeMutablePointer <int16>转换为UInt8

时间:2018-02-15 17:41:40

标签: swift unsafemutablepointer

我正在尝试将此Int16可变指针转换为UInt8以写入OutputStream。我尝试使用函数.withMemoryRebound,但我不知道如何正确地执行此操作。我想用这个功能做,我试了一次但没有成功。我能够使用下面的代码,但我不认为它是正确的。

unwrappedOutputStream.open()

let buffer: UnsafeMutablePointer<Int16> = avAudioPCMBuffer.int16ChannelData![0]
let size = MemoryLayout<UInt8>.size

let bound: UnsafeMutablePointer<UInt16> = UnsafeMutablePointer.allocate(capacity: 1)
bound.pointee = UInt16(bitPattern: buffer.pointee)

let bytePointer: UnsafeMutablePointer<UInt8> = UnsafeMutablePointer.allocate(capacity: 1)

bytePointer.pointee = UInt8(bound.pointee >> 0x8)
unwrappedOutputStream.write(bytePointer, maxLength: size)

bytePointer.pointee = UInt8(bound.pointee & 0xff)
unwrappedOutputStream.write(bytePointer, maxLength: size)

bound.deallocate(capacity: 1)
bytePointer.deallocate(capacity: 1)

unwrappedOutputStream.close()

我目前正在使用Swift 4,有什么我可以做的吗? 谢谢你,我感谢你的耐心等待。

1 个答案:

答案 0 :(得分:1)

Unsafe(Mutable)Pointer<Int16>投射到UnsafePointer<Int8> 只会是:

let buffer: UnsafeMutablePointer<Int16> = ...
let count: Int = ... // # of Int16 values

let result = buffer.withMemoryRebound(to: UInt8.self, capacity: 2 * count) {
    outputStream.write($0, maxLength: 2 * count)
}