首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将带有长度的UnsafePointer转换为Swift数组类型

将带有长度的UnsafePointer转换为Swift数组类型
EN

Stack Overflow用户
提问于 2015-09-16 19:12:12
回答 2查看 16.9K关注 0票数 31

我正在寻找在Swift中实现合理的C语言互操作性的最简单的方法,我当前的代码块是将一个UnsafePointer<Int8> (曾经是一个const char *)转换为一个[Int8]数组。

目前,我有一个朴素的算法,它可以获取一个UnsafePointer和许多字节,并将其逐个元素地转换为数组:

代码语言:javascript
复制
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或类似的方法。如果上面的算法真的是唯一的方法,我很乐意坚持下去。

EN

回答 2

Stack Overflow用户

发布于 2016-09-01 20:06:41

代码语言:javascript
复制
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)

复制扩展并使用它..

票数 2
EN

Stack Overflow用户

发布于 2020-12-29 20:34:09

您还可以使用Array init函数:

代码语言:javascript
复制
init(unsafeUninitializedCapacity: Int, initializingWith initializer: (inout UnsafeMutableBufferPointer<Element>, inout Int) throws -> Void) rethrows

如果需要,首先将unsafeRawPointer转换为unsafePointer,然后将指针转换为缓冲区指针,最后将缓冲区指针转换为数组。

例如,假设您有一个unsafeRawPointer (dataPtr)及其大小(dataSize)

代码语言:javascript
复制
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]
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32606989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档