How to get bytes out of an UnsafeMutableRawPointer? How to get bytes out of an UnsafeMutableRawPointer? swift swift

How to get bytes out of an UnsafeMutableRawPointer?


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

let ptr = ... // Unsafe[Mutable]RawPointerlet 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


Here's a Swift 4 example of converting a literal UInt8 array to an UnsafeMutableRawPointer and back to an UInt32 array

static func unsafePointerTest() {    //let a : [UInt8] = [0,0,0,4,0,0,0,8,0,0,0,12]    let a : [UInt8] = [0x04, 0x00, 0x00, 0x00,                       0x08, 0x00, 0x00, 0x00,                       0x0C, 0x00, 0x00, 0x00] //little endian    //0xFF, 0xF0, 0xF0, 0x12]  //317780223 = 12F0F0FF    let b:UnsafeMutableRawPointer = UnsafeMutableRawPointer(mutating:a)    let bTypedPtr = b.bindMemory(to: UInt32.self, capacity: a.count/4)    let UInt32Buffer = UnsafeBufferPointer(start: bTypedPtr, count: a.count/4)    let output = Array(UInt32Buffer)    print(output)}


Create Data object.

init(bytesNoCopy bytes: UnsafeMutableRawPointer, count: Int, deallocator: Data.Deallocator)

One important way missing from the other answers here is initialising a Data object with UnsafeMutableRawPointer. The data object can then be used for other calculations.

public func base64(quality: Int32 = 67) -> String? {    var size: Int32 = 0    if let image = gdImageJpegPtr(internalImage, &size, quality) {        // gdImageJpegPtr returns an UnsafeMutableRawPointer that is converted to a Data object        let d = Data(bytesNoCopy: image, count: Int(size), deallocator: .none)        return d.base64EncodedString()    }    return nil}