gpt4 book ai didi

objective-c - 将 unsinged char 数组从 objective-c 快速转换为 UnsafeMutablePointer

转载 作者:太空宇宙 更新时间:2023-11-04 03:26:46 25 4
gpt4 key购买 nike

我有一个 unsigned char .h 文件中的数组。而且,我还有一个将无符号字符数组作为输入的函数。当我尝试快速调用此函数时,它得到 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.0 获得值(value), KEY.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>

最佳答案

一个C数组

unsigned char ckey[64];

在 Swift 中作为元组导入:

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

并且不能通过索引下标来访问元组元素。(好吧,您可以在使用 Mirror)。

但是:

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

后者是 confirmed by Apple engineer Joe Groff:

... You can leave the struct defined in C and import it into Swift. Swift will respect C's layout.

因此您可以将第一个元组元素的地址传递给函数:

f(key: &ckey.0)

当然——就像在 C 中一样——关于数组大小的信息是丢失,所以数组应该以 NUL 结尾,或者 f 应该知道关于数组大小。或者,传递尺寸作为函数的附加参数:

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

关于objective-c - 将 unsinged char 数组从 objective-c 快速转换为 UnsafeMutablePointer<UInt8>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40560774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com