C 将[UIn16]快速转换为非女性化指针<;UInt16>;

C 将[UIn16]快速转换为非女性化指针<;UInt16>;,c,swift,unsafemutablepointer,uint16,C,Swift,Unsafemutablepointer,Uint16,我试图将UInt16数组转换为unsafemeutablepointer,以便调用从Swift获取UInt16\u t*的C函数 如果我的起点是[UInt8],而目标是非女性化指针,那么一切都会很简单。我可以将数组转换为数据,从那里转换为NSData,调用字节。assumingMemoryBound,这样我就(几乎)完成了 然而,就目前的任务而言,我正在考虑几种不同的途径。一种方法是将[UInt16]转换为[UInt8],使用与上述相同的数据路径,然后在assumingMemoryBound调用

我试图将
UInt16
数组转换为
unsafemeutablepointer
,以便调用从Swift获取
UInt16\u t*
的C函数

如果我的起点是
[UInt8]
,而目标是
非女性化指针
,那么一切都会很简单。我可以将数组转换为
数据
,从那里转换为
NSData
,调用
字节。assumingMemoryBound
,这样我就(几乎)完成了

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

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

我正在尝试的另一种方法是简单地获取
[UInt16]
数组值,并尝试使用中间
withUnsafeBytes
调用或类似的方法将其转换为
unsafetablepointer
,但是Swift有一系列不同的指针类型,它们根本不匹配。具体来说,以下是我之前的一次尝试:

array.withUnsafeBytes { (pointer: UnsafeRawBufferPointer) -> UnsafeMutablePointer<UInt16> in
    let mutablePointer = UnsafeMutablePointer<UInt16>(mutating: pointer) // error
    return mutablePointer
}
array.withUnsafeBytes{(指针:UnsafeRawBufferPointer)->中的UnsafeMutablePointer
让mutablePointer=unsafemeutablepointer(mutating:pointer)//错误
返回可变指针
}
但会导致以下错误:

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


也许我只是还没有找到正确的问题或正确的文档页面,所以我希望有任何指向正确方向的指针

带有xxxBytes的
方法可以获得原始指针,但这里需要一个类型化指针。改为使用并获取基址:

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
}

这很有效,谢谢!在我的特定情况下,数组是发生此转换的方法的不可变参数,因此我使用
withUnsafeBufferPointer