从 Swift 字符串转换为 const char*
Converting from Swift string to const char*
我正在尝试将 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"
但是当我这样传递它时它不起作用
internal var ipAddress:String = "192.168.1.43"
我在需要指定类型的函数中需要这个:
internal func setupArtnode(ip:String) -> Int{
我尝试使用 AnyObject 而不是 String,但这也不起作用。
谢谢。
您没有指定 Swift 数组包含的内容。无论如何,您需要将 Swift 数组转换为 Int8
:
的数组
let str = "Hello world"
let cArray = str.cString(using: .utf8)
artnet_new(cArray, 1)
您应该能够将 String
直接传递给需要 const char *
的 C 函数,它会自动转换为以 null 结尾的 UTF-8 字符串:
let string = "string"
let node = artnet_new(string, 1)
有关详细信息,请参阅 Interacting with C APIs 。以下是相关摘录:
When a function is declared as taking an UnsafePointer argument,
it can accept any of the following:
- A String value, if Type is Int8 or UInt8. The string will automatically be converted to UTF8 in a buffer, and a pointer to that
buffer is passed to the function.
不确定为什么,但此代码有效。这会将一个字符串传递给一个 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)
...
Swift3
的简单方法
var ipAddress: String = "192.168.1.43"
var verbose: Int = 1
artnet_node artnet_new((ipAddress as NSString).utf8String, verbose)
我正在尝试将 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"
但是当我这样传递它时它不起作用
internal var ipAddress:String = "192.168.1.43"
我在需要指定类型的函数中需要这个:
internal func setupArtnode(ip:String) -> Int{
我尝试使用 AnyObject 而不是 String,但这也不起作用。
谢谢。
您没有指定 Swift 数组包含的内容。无论如何,您需要将 Swift 数组转换为 Int8
:
let str = "Hello world"
let cArray = str.cString(using: .utf8)
artnet_new(cArray, 1)
您应该能够将 String
直接传递给需要 const char *
的 C 函数,它会自动转换为以 null 结尾的 UTF-8 字符串:
let string = "string"
let node = artnet_new(string, 1)
有关详细信息,请参阅 Interacting with C APIs 。以下是相关摘录:
When a function is declared as taking an UnsafePointer argument, it can accept any of the following:
- A String value, if Type is Int8 or UInt8. The string will automatically be converted to UTF8 in a buffer, and a pointer to that buffer is passed to the function.
不确定为什么,但此代码有效。这会将一个字符串传递给一个 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)
...
Swift3
var ipAddress: String = "192.168.1.43"
var verbose: Int = 1
artnet_node artnet_new((ipAddress as NSString).utf8String, verbose)