我是靠谱客的博主 无情水杯,最近开发中收集的这篇文章主要介绍swift c语言 字符串,关于ios:将Swift 4字符串转换为C unsigned char *,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

我正在尝试与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 *所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部