如何在Swift中将UInt8字节数组转换为字符串

Sun*_*mar 43 arrays swift

UInt8在使用swift 将Byte数组转换为字符串时遇到问题.我搜索并找到一个简单的解决方案

String.stringWithBytes(buff, encoding: NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)

但它显示错误String.type没有成员stringWithBytes.谁能建议我一个解决方案?

这是我的代码,我得到一个NSData并转换为字节数组,然后我必须将该字节数组转换为字符串.

let count = data.length / sizeof(UInt8)
var array = [UInt8](count: count, repeatedValue: 0)
data.getBytes(&array, length:count * sizeof(UInt8))
String.stringWithBytes(buff, encoding: NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 72

Swift 3/Xcode 8的更新:

字符串来自bytes: [UInt8]:

if let string = String(bytes: bytes, encoding: .utf8) {
    print(string)
} else {
    print("not a valid UTF-8 sequence")
}
Run Code Online (Sandbox Code Playgroud)

字符串来自data: Data:

let data: Data = ...
if let string = String(data: data, encoding: .utf8) {
    print(string)
} else {
    print("not a valid UTF-8 sequence")
}
Run Code Online (Sandbox Code Playgroud)

Swift 2/Xcode 7的更新:

字符串来自bytes: [UInt8]:

if let string = String(bytes: bytes, encoding: NSUTF8StringEncoding) {
    print(string)
} else {
    print("not a valid UTF-8 sequence")
}
Run Code Online (Sandbox Code Playgroud)

字符串来自data: NSData:

let data: NSData = ...
if let str = String(data: data, encoding: NSUTF8StringEncoding) {
    print(str)
} else {
    print("not a valid UTF-8 sequence")
}
Run Code Online (Sandbox Code Playgroud)

上一个答案:

String没有stringWithBytes()方法. NSString有个

 NSString(bytes: , length: , encoding: )
Run Code Online (Sandbox Code Playgroud)

您可以使用的方法,但您可以直接从中创建字符串NSData,而无需UInt8数组:

if let str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String {
    println(str)
} else {
    println("not a valid UTF-8 sequence")
}
Run Code Online (Sandbox Code Playgroud)


dav*_*d72 9

这对我有用:

String(bytes: bytes, encoding: NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)


Mar*_*k H 9

Swifty解决方案

array.reduce("", combine: { $0 + String(format: "%c", $1)})
Run Code Online (Sandbox Code Playgroud)

十六进制表示

array.reduce("", combine: { $0 + String(format: "%02x", $1)})
Run Code Online (Sandbox Code Playgroud)

  • Swift 3:```array.reduce("",{$ 0 + String(格式:"%c",$ 1)})``` (3认同)

0xF*_*0xF 9

Swift 5.2.2 更新:

String(decoding: yourByteArray, as: UTF8.self)
Run Code Online (Sandbox Code Playgroud)


小智 5

此解决方案有效.

NSString(bytes: data!, length: data!.count, encoding: NSUTF8StringEncoding) 
Run Code Online (Sandbox Code Playgroud)


Lef*_*tyT 5

斯威夫特 3

由于“NSUTF8StringEncoding”,以下给了我一个错误:

String(data: nsdata, encoding: NSUTF8StringEncoding)! 
Run Code Online (Sandbox Code Playgroud)

这在 swift 3 中对我有用:

let xmlStr:String = String(bytes: data!, encoding: String.Encoding.utf8)!
Run Code Online (Sandbox Code Playgroud)


小智 5

对于无法将字节数组转换为字符串的任何人,请尝试此操作

String(data: Data(decrypted), encoding: .utf8)
Run Code Online (Sandbox Code Playgroud)

这是我的示例字符串扩展。我将它用于 AES

extension String {

    func decryptAES(key: String, iv: String) -> String {
        do {
            let encrypted = self
            let key = Array(key.utf8)
            let iv = Array(iv.utf8)
            let aes = try AES(key: key, blockMode: CTR(iv: iv), padding: .noPadding)
            let decrypted = try aes.decrypt(Array(hex: encrypted))
            return String(data: Data(decrypted), encoding: .utf8) ?? ""
        } catch {
            return "Error: \(error)"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)