Converting an UnsafePointer with length to a Swift Array type

后端 未结 2 789
执念已碎
执念已碎 2020-12-16 10:04

I\'m looking for the simplest ways to achieve reasonable C interoperability in Swift, and my current block is converting an UnsafePointer (which was

相关标签:
2条回答
  • 2020-12-16 10:53
    extension NSData {
    
        public func convertToBytes() -> [UInt8] {
            let count = self.length / sizeof(UInt8)
            var bytesArray = [UInt8](count: count, repeatedValue: 0)
            self.getBytes(&bytesArray, length:count * sizeof(UInt8))
            return bytesArray
        }
    }
    

    You can convert row data to byts (Uint8)

    Copy Extension and use it..

    0 讨论(0)
  • 2020-12-16 11:07

    You can simply initialize a Swift Array from an UnsafeBufferPointer:

    func convert(length: Int, data: UnsafePointer<Int8>) -> [Int8] {
    
        let buffer = UnsafeBufferPointer(start: data, count: length);
        return Array(buffer)
    }
    

    This creates an array of the needed size and copies the data.

    Or as a generic function:

    func convert<T>(count: Int, data: UnsafePointer<T>) -> [T] {
    
        let buffer = UnsafeBufferPointer(start: data, count: count);
        return Array(buffer) 
    }
    

    where length is the number of items that the pointer points to.

    If you have a UInt8 pointer but want to create an [T] array from the pointed-to data, then this is a possible solution:

    // Swift 2:
    func convert<T>(length: Int, data: UnsafePointer<UInt8>, _: T.Type) -> [T] {
    
        let buffer = UnsafeBufferPointer<T>(start: UnsafePointer(data), count: length/strideof(T));
        return Array(buffer) 
    }
    
    // Swift 3:
    func convert<T>(length: Int, data: UnsafePointer<UInt8>, _: T.Type) -> [T] {
        let numItems = length/MemoryLayout<T>.stride
        let buffer = data.withMemoryRebound(to: T.self, capacity: numItems) {
            UnsafeBufferPointer(start: $0, count: numItems)
        }
        return Array(buffer) 
    }
    

    where length now is the number of bytes. Example:

    let arr  = convert(12, data: ptr, Float.self)
    

    would create an array of 3 Floats from the 12 bytes pointed to by ptr.

    0 讨论(0)
提交回复
热议问题