我正在寻找在Swift中实现合理的C语言互操作性的最简单的方法,我当前的代码块是将一个UnsafePointer<Int8>
(曾经是一个const char *
)转换为一个[Int8]
数组。
目前,我有一个朴素的算法,它可以获取一个UnsafePointer
和许多字节,并将其逐个元素地转换为数组:
func convert(length: Int, data: UnsafePointer<Int8>) {
let buffer = UnsafeBufferPointer(start: data, count: length);
var arr: [Int8] = [Int8]()
for (var i = 0; i < length; i++) {
arr.append(buffer[i])
}
}
使用arr.reserveCapacity(length)
可以加快循环本身的速度,但是这并不能消除循环本身的问题。
我知道this SO question,它涵盖了如何将UnsafePointer<Int8>
转换为String
,然而String
与[T]
完全不同。有没有一种方便快捷的方法将长度字节从UnsafePointer<T>
复制到[T]
中?我更喜欢纯Swift方法,不需要通过NSData
或类似的方法。如果上面的算法真的是唯一的方法,我很乐意坚持下去。
发布于 2016-09-01 20:06:41
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
}
}
您可以将行数据转换为字节(Uint8)
复制扩展并使用它..
发布于 2020-12-29 20:34:09
您还可以使用Array init函数:
init(unsafeUninitializedCapacity: Int, initializingWith initializer: (inout UnsafeMutableBufferPointer<Element>, inout Int) throws -> Void) rethrows
如果需要,首先将unsafeRawPointer转换为unsafePointer,然后将指针转换为缓冲区指针,最后将缓冲区指针转换为数组。
例如,假设您有一个unsafeRawPointer (dataPtr
)及其大小(dataSize
)
let numberOfItems = dataSize / MemoryLayout<MyClass>.stride
let myArray = dataPtr.withMemoryRebound(to: MyClass.self,
capacity: numberOfItems) { typedPtr in
// Convert pointer to buffer pointer to access buffer via indices
let bufferPointer = UnsafeBufferPointer(start: typedPtr, count: numberOfItems)
// Construct array
return [MyClass](unsafeUninitializedCapacity: numberOfItems) { arrayBuffer, count in
count = numberOfItems
for i in 0..<count {
arrayBuffer[i] = bufferPointer[i]
}
}
}
https://stackoverflow.com/questions/32606989
复制相似问题