概述
我正在尝试与Swift的C API进行交互,并且能够成功地将unsigned char *转换为String,但是无法将String转换回unsigned char *
这是我的C函数,它返回传递的字符串:
unsigned char* test(unsigned char* hello) {
return hello;
}
这是我的快速代码来调用不起作用的c函数:
let str ="hello, world!"
print(String(cString:test(str)))
其目标是将" hello,world"传递给c,然后让c传递" hello,world",然后进行打印。
我从这里尝试过解决方案,但是对于Swift 4,它们似乎都已经过时了
缓冲区尝试:
let buffer = UnsafeMutableBufferPointer.allocate(capacity: 4)
_ = buffer.initialize(from: 1...4)
print(String(cString: test(buffer)))
错误:
无法将类型" UnsafeMutableBufferPointer"的值转换为预期的参数类型" UnsafeMutablePointer!"。
"我从这里尝试过解决方案"是什么样的?
从自动String到指针的转换中返回的指针是不安全的,因为只能保证在调用过程中其存储有效。如果您的C API实际上做了类似的事情,您将无法使用自动转换。
什么是String?
@WeatherVane,这是Swift中的标准字符串类型。
如果我想要一个字符串" hello world转到c然后返回,您如何建议我执行此操作?
您需要使用UnsafeMutableBufferPointer.allocate,在其中复制字符串,执行所需的任何操作,然后取消分配缓冲区指针。
在这里应该使用char,而没有unsigned限定符。您实际上是在处理字符,而不是UCHAR_MIN和UCHAR_MAX之间的整数
我现在真的关闭了。我创建了一个缓冲区,并试图将其传递给test(unsigned char *)函数,但它给了我一个错误。 prntscr.com/kgt27z您是否知道如何将UnsafeMutablePointer 转换为UnsafeMutablePointer !
更新您的问题并显示您尝试过的所有代码。
我用我的缓冲尝试更新了问题。 C代码还是一样的
您需要为UnsafeMutableBufferPointer指定元素类型。
可以通过属性baseAddress访问指向UnsafeMutableBufferPointer内容的指针。
尝试这个:
let str ="hello, world!"
let buffer = UnsafeMutableBufferPointer.allocate(capacity: str.utf8.count + 1)
defer {buffer.deallocate()}
memcpy(buffer.baseAddress, str, str.utf8.count + 1)
print(String(cString: test(buffer.baseAddress)))
做工精美。 谢谢!
最后
以上就是无情水杯为你收集整理的swift c语言 字符串,关于ios:将Swift 4字符串转换为C unsigned char *的全部内容,希望文章能够帮你解决swift c语言 字符串,关于ios:将Swift 4字符串转换为C unsigned char *所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复