1

我正在尝试将UInt16数组转换为 anUnsafeMutablePointer<UInt16>以调用uint16_t *从 Swift 获取 a 的 C 函数。

如果我的起点是[UInt8],我的目的地UnsafeMutablePointer<UInt8>是,一切都会很容易。我可以将数组转换为Data,从那里转换为NSData,调用bytes.assumingMemoryBound,这样我就(几乎)完成了。

然而,随着手头的任务,我正在考虑几种不同的路径。一种方法是将 转换[UInt16][UInt8],使用与上述相同的数据路径,然后在assumingMemoryBound调用中指定不同的类型。

不过,事实证明,这比预期的要复杂得多。关于如何将只有两个UInt8s的数组转换为一个有很多问题UInt16;我发现了一个问题,询问如何将单个转换UInt16为两个UInt8s,但是在转换数组时,这一切似乎都变得更加复杂。

我正在尝试的另一种方法是简单地获取[UInt16]数组值并尝试将其转换为UnsafeMutablePointer<UInt16>使用中间withUnsafeBytes调用或类似的东西,但 Swift 有一堆不同的指针类型,它们根本不匹配。具体来说,这是我早期的尝试之一:

array.withUnsafeBytes { (pointer: UnsafeRawBufferPointer) -> UnsafeMutablePointer<UInt16> in
    let mutablePointer = UnsafeMutablePointer<UInt16>(mutating: pointer) // error
    return mutablePointer
}

这虽然会导致以下错误:

无法将“UnsafeRawBufferPointer”类型的值转换为预期的参数类型“UnsafePointer”

也许我还没有找到正确的问题或正确的文档页面,所以我很感激任何正确方向的指示!

4

1 回答 1

1

这些withXXXBytes方法为您提供原始指针,但在这里您需要一个类型化的指针。改为使用withUnsafeMutableBufferPointer并获取基地址:

arrayOfUInt16.withUnsafeMutableBufferPointer { (bufferPointer) in
    let mutablePointerOfUInt16 = bufferPointer.baseAddress
    // do whatever you want with mutablePointerOfUInt16
    // just don't "store or return the pointer for later use." as the documentation says 
    // because the pointer is only valid within this block
}
于 2021-04-02T07:07:07.733 回答