将unsinged char数组从objective-c转换为UnsafeMutablePointer <uint8> swift

时间:2016-11-12 07:51:45

标签: objective-c c swift

我在.h文件中有一个unsigned char数组。而且,我还有一个函数,它将unsigned char数组作为输入。当我尝试在swift中调用此函数时,它会得到UnsafeMutablePointer<UInt8>。因此,自动objective-c到swift转换器认为unsigned char应该转换为UnsafeMutablePointer<UInt8>。但是,我无法直接将我的变量传递给此函数。因为我明白了,

Cannot convert value of type '(UInt8, UInt8, UInt8, UInt8, UInt8)' to expected argument type 'UnsafeMutablePointer<UInt8>!'

此数组的长度是静态的。所以,我可以创建

let key = UnsafeMutablePointer<UInt8>.allocate(capacity: 64);

而且,我也可以通过KEY.0KEY.1等获得价值。所以,我只需要创建一个for循环来从KEY读取值并分配它到key

 for index in 1...64 {
     key[index] = KEY[index];
 }

但是,这会产生编译错误:

 Value of tuple type '(UInt8, UInt8, UInt8, UInt8, UInt8)' has no member 'index'

所以,第一个问题,我如何通过索引从KEY获取任何值。其次,有没有更简单的方法将unsigned char数组转换为UnsafeMutablePointer<UInt8>

1 个答案:

答案 0 :(得分:1)

C数组

unsigned char ckey[64];

在Swift中作为元组导入:

public var ckey: (UInt8, ..., UInt8)

并且无法通过下标索引来访问元组元素。 (嗯,使用Mirror可以)。

然而:

  • C数组的地址与第一个地址相同 数组元素和
  • 对于从C导入的结构 Swift保留了内存布局。

后者是confirmed by Apple engineer Joe Groff:

  

...您可以保留在C中定义的结构并将其导入Swift。斯威夫特将尊重C的布局。

因此,您可以将第一个元组元素的地址传递给 功能:

f(key: &ckey.0)

当然 - 就像在C中一样 - 关于数组大小的信息是 丢失,所以数组应该是NUL终止的,或者f 知道 关于数组大小。或者,传递大小 作为函数的另一个参数:

foo(key: &ckey.0, length: MemoryLayout.size(ofValue: ckey))