2016-09-16 129 views
3

我有一個c api,返回一個空終止的字符串,它是一個類型爲unsigned char*(對應於UnsafePointer<UInt8>)的數組。Swift 3:將空終止的UnsafePointer <UInt8>轉換爲字符串

斯威夫特有初始化程序String(validatingUTF8:),但參數必須是UnsafePointer<CChar>(又名UnsafePointer<Int8>),並且在這兩者之間轉換沒有無關緊要的方法。

如何將此空值終止的c-string轉換爲Swift字符串?

回答

8

在夫特3,String具有兩個初始化

public init(cString: UnsafePointer<CChar>) 
public init(cString: UnsafePointer<UInt8>) 

因此它可以從符號和無符號的字符(空終止)序列來創建。所以

let s = String(cString: yourCharPointer) 

應該只是工作。


String具有另一個初始化

public init?(validatingUTF8 cString: UnsafePointer<CChar>) 

其中上形成不良的UTF-8序列失敗代替由替換字符替換它們 的。此init方法沒有對應的 取得無符號字符。

以現有的實現中CString.swift作爲示例,這不是太困難添加此作爲一個擴展:

extension String { 
    public init?(validatingUTF8 cString: UnsafePointer<UInt8>) { 
     guard let (s, _) = String.decodeCString(cString, as: UTF8.self, 
               repairingInvalidCodeUnits: false) else { 
      return nil 
     } 
     self = s 
    } 
} 

然後

if let s = String(validatingUTF8: yourCharPointer) { 
    print(s) 
} else { 
    print("invalid UTF-8") 
} 

還與(空終止)序列的有符號和無符號字符。

+0

明白了。它沒有出現在我的自動完成中。 – AthanasiusOfAlex