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)))

做工精美。 谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值