Search code examples
swiftunsafe-pointers

How to get bytes out of an UnsafeMutableRawPointer?


How does one access bytes (or Int16's, floats, etc.) out of memory pointed to by an UnsafeMutableRawPointer (new in Swift 3) handed to a Swift function by a C API (Core Audio, etc.)


Solution

  • load<T> reads raw bytes from memory and constructs a value of type T:

    let ptr = ... // Unsafe[Mutable]RawPointer
    let i16 = ptr.load(as: UInt16.self)
    

    optionally at a byte offset:

    let i16 = ptr.load(fromByteOffset: 4, as: UInt16.self)
    

    There is also assumingMemoryBound() which converts from a Unsafe[Mutable]RawPointer to a Unsafe[Mutable]Pointer<T>, assuming that the pointed-to memory contains a value of type T:

    let i16 = ptr.assumingMemoryBound(to: UInt16.self).pointee
    

    For an array of values you can create a "buffer pointer":

    let i16bufptr = UnsafeBufferPointer(start: ptr.assumingMemoryBound(to: UInt16.self), count: count)
    

    A buffer pointer might already be sufficient for your purpose, it is subscriptable and can be enumerated similarly to an array. If necessary, create an array from the buffer pointer:

    let i16array = Array(i16bufptr)
    

    As @Hamish said, more information and details can be found at