swift - 将 swift 字符串复制到固定大小的 char[][]
问题描述
我有一个像这样的 C 结构。
struct someStruct {
char path[10][MAXPATHLEN];
};
我想将 Swift 字符串列表复制到 char[10][] 数组中。
对我来说,在 Swift 中处理 c 二维 char 数组非常具有挑战性。任何人都可以分享一些可以与 Swift 5 一起使用的代码吗?谢谢!
解决方案
C 数组作为元组导入 Swift。这里我们有一个二维 C 数组,它在 Swift 中变成了一个嵌套元组:
public struct someStruct {
public var path: (
(Int8, ..., Int8),
(Int8, ..., Int8),
...
(Int8, ..., Int8)
)
}
我知道没有真正“好”的解决方案,但是使用 Swift 保留导入的 C 结构(source)的内存布局这一事实,可以通过一些指针魔术来实现目标:
var s = someStruct()
let totalSize = MemoryLayout.size(ofValue: s.path)
let itemSize = MemoryLayout.size(ofValue: s.path.0)
let numItems = totalSize / itemSize
withUnsafeMutablePointer(to: &s.path) {
$0.withMemoryRebound(to: Int8.self, capacity: totalSize) { ptr in
for i in 0..<numItems {
let itemPtr = ptr + i * itemSize
strlcpy(itemPtr, "String \(i)", itemSize)
}
print(ptr)
}
}
ptr
是指向 的指针s.path
,并且itemPtr
是指向 的指针s.path[i]
。strlcpy
复制字符串,这里我们使用这样一个事实,即可以将 Swift 字符串直接传递给带有const char*
参数的 C 函数(并且会自动创建一个临时的以 null 结尾的 UTF-8 表示)。
推荐阅读
- javascript - Google Web Designer:Javascript API - 跳转到关键帧并停止
- php - PHP 加密/解密 - AES-256-ECB
- symfony - 有没有办法使用 ApiPlatform 分页来获取总项目?
- r - 使用“prcomp”输出摘要的“累积比例”部分生成对总方差的累积贡献的碎石图
- mysql - 如何使用多个条件更改 sql
- python - 删除元素,然后迭代并组合列表python中的元素
- asp.net - NET 5.0 web 项目 - 无法在启动时更改连接 URL (+ Docker)
- c# - 如何禁用 ComboBox 中第一项的自动选择?
- php - Laravel Cashier 收费方法失败,单次收费 3d 安全
- postgresql - 如何将数组传递给 postgresql where 查询?