从Swift字符串转换为const char *

时间:2016-12-23 22:17:07

标签: c swift swift3 swift4

我正在尝试将const char *传递给从Swift中的Swift字符串转换的旧C库。

这是我正在调用的C函数:

artnet_node artnet_new(const char *ip, int verbose) { ...

如何将Swift字符串转换为此const char类型?当我像这样传递ipAddress时它可以工作:

internal var ipAddress = "192.168.1.43"

但是当我像这样传递它时,dit不起作用

internal var ipAddress:String = "192.168.1.43"

我需要在需要指定类型的函数中使用它:

internal func setupArtnode(ip:String) -> Int{

我尝试使用AnyObject而不是String,但这也不起作用。

感谢。

4 个答案:

答案 0 :(得分:4)

您应该能够将String直接传递给期望const char *的C函数,它将自动转换为以null结尾的UTF-8字符串:

let string = "string"
let node = artnet_new(string, 1)

有关详细信息,请参阅Interacting with C APIs 。以下是相关摘录:

  

当一个函数被声明为采用UnsafePointer参数时,   它可以接受以下任何一种:

     
      
  • String类型,如果Type为Int8或UInt8。该字符串将自动在缓冲区中转换为UTF8,并指向该字符串   缓冲区传递给函数。
  •   

答案 1 :(得分:2)

不确定原因,但此代码正常运行。这会将一个字符串传递给C函数,该函数需要一个const char *,它似乎与unsafePointer相同。

internal func setupArtnode(ipAddress:String) -> NSInteger{
    let cString = self.ipAddress.cString(using: String.defaultCStringEncoding)!
    let newString:String = NSString(bytes: cString, length: Int(ipAddress.characters.count), encoding:String.Encoding.ascii.rawValue)! as String
    let key2Pointer = UnsafePointer<Int8>(newString)

    node = artnet_new(key2Pointer, Int32(verbose))     // VERBOSE : true(1) , false(0)
...

答案 2 :(得分:2)

Swift 3的简单方法

var ipAddress: String = "192.168.1.43"
var verbose: Int = 1
artnet_node artnet_new((ipAddress as NSString).utf8String, verbose)

答案 3 :(得分:0)

您没有指定Swift数组包含的内容。无论如何,您需要将Swift数组转换为Int8

的数组
let str = "Hello world"
let cArray = str.cString(using: .utf8)

artnet_new(cArray, 1)