将 swift 4 字符串转换为 c unsigned char *

Posted

技术标签:

【中文标题】将 swift 4 字符串转换为 c unsigned char *【英文标题】:Converting a swift 4 string to c unsigned char * 【发布时间】:2018-08-09 19:36:16 【问题描述】:

我正在尝试与 Swift 的 C API 进行交互,并且能够成功地将 unsigned char* 转换为 String,但无法将 String 转换回 unsigned char *

这是我的 C 函数,它返回传递的字符串:

unsigned char* test(unsigned char* hello) 
    return hello;

这是我调用不起作用的 c 函数的快速代码:

让 str = "你好,世界!" 打印(字符串(cString:test(str)))

它的目标是把“hello, world”传给c,然后让c传回“hello, world”然后打印出来。

我已经尝试过这里的解决方案,但它们对于 Swift 4 来说似乎都已经过时了

缓冲尝试:

让缓冲区 = UnsafeMutableBufferPointer.allocate(容量: 4)

_ = buffer.initialize(来自:1...4)

打印(字符串(cString:测试(缓冲区)))

错误:

无法将“UnsafeMutableBufferPointer”类型的值转换为预期的参数类型“UnsafeMutablePointer!”

【问题讨论】:

“我已经尝试过这里的解决方案”之类的? 返回从自动String 到指针转换中获得的指针是不安全的,因为它的存储只保证在调用期间有效。如果您的 C API 确实做了类似的事情,您将无法使用自动转换。 什么是String @WeatherVane,它是 Swift 中的标准字符串类型。 您需要使用UnsafeMutableBufferPointer.allocate,将您的字符串复制到那里,做您需要做的任何事情,然后释放缓冲区指针。 【参考方案1】:

您需要为UnsafeMutableBufferPointer指定元素类型。

可以通过baseAddress属性访问指向UnsafeMutableBufferPointer内容的指针。

试试这个:

let str = "hello, world!"

let buffer = UnsafeMutableBufferPointer<CUnsignedChar>.allocate(capacity: str.utf8.count + 1)
defer buffer.deallocate()

memcpy(buffer.baseAddress, str, str.utf8.count + 1)

print(String(cString: test(buffer.baseAddress)))

【讨论】:

效果很好。谢谢!

以上是关于将 swift 4 字符串转换为 c unsigned char *的主要内容,如果未能解决你的问题,请参考以下文章

将 size_t 转换为向量<unsigned char>

刚开始学C++,想请教高手们一下,将CString类型字符串转换为unsigned char型字符数组的转化方式

将 unsigned int + 字符串转换为 unsigned char 向量

字符串怎么转换为unsigned char数组

将 Swift 字符串数组转换为 C 字符串数组指针

将 Swift 字符串数组转换为 C 字符串数组指针