Hoe UInt8-bytearray naar string in Swift te converteren

Ik heb problemen bij het snel converteren van UInt8Byte-array naar string. Ik heb gezocht en een eenvoudige oplossing gevonden

String.stringWithBytes(buff, encoding: NSUTF8StringEncoding)

maar het toont de fout String.typeheeft geen lid stringWithBytes. Kan iemand mij een oplossing voorstellen?

dit is mijn code waar ik eenNSDatakrijg en omgezet in bytes-array en dan moet ik die byte-array converteren naar string.

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)

Antwoord 1, autoriteit 100%

Update voor Swift 3/Xcode 8:

String van bytes: [UInt8]:

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

String van data: Data:

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

Update voor Swift 2/Xcode 7:

String van bytes: [UInt8]:

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

String van data: NSData:

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

Vorige antwoord:

Stringheeft geen methode stringWithBytes().
NSStringheeft een

NSString(bytes: , length: , encoding: )

methode die u zou kunnen gebruiken, maar u kunt de tekenreeks rechtstreeks vanuit NSDatamaken, zonder dat u een UInt8-array nodig heeft:

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

Antwoord 2, autoriteit 17%

Snelle oplossing

array.reduce("", combine: { $0 + String(format: "%c", $1)})

Hex-weergave:

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

Antwoord 3, autoriteit 13%

Update voor Swift 5.2.2:

String(decoding: yourByteArray, as: UTF8.self)

Antwoord 4, autoriteit 11%

Dit werkte voor mij:

String(bytes: bytes, encoding: NSUTF8StringEncoding)

Antwoord 5, autoriteit 5%

Deze oplossing werkt.

NSString(bytes: data!, length: data!.count, encoding: NSUTF8StringEncoding) 

Antwoord 6, autoriteit 2%

Niet erg elegant of ‘Swifty’, maar dit is eenvoudig en het werkt:

let i: UInt8 = 65
let s = String(format: "%c", i)  // A

Ik heb uren verspild aan het zoeken naar een gemakkelijke manier om dit te doen, voordat ik plotseling dacht aan ‘printf’ uit mijn Unix-scriptingdagen!


Antwoord 7, autoriteit 2%

Compleet voorbeeld voor Swift 2 & 3:

import Foundation
let bytes : [UInt8] = [72, 73]
let nsdata = NSData(bytes: bytes as [UInt8], length: 2)
let str = String(data: nsdata, encoding: NSUTF8StringEncoding)! // 'HI'

Antwoord 8

“MSString(bytes: , lengte: , codering: )” lijkt niet te werken vanaf 26 juli 2015

Bytewaarden converteren naar ASCII lijkt problematisch, als je een muur hebt geraakt, kun je het als volgt op de moeilijke manier doen (en misschien mis ik iets met swift, maar ik kon geen oplossingen vinden binnen mijn tijdsbestek.) worden gedaan met twee functies. De eerste functie accepteert een UInt8 en converteert die naar een “\u{}” representatie, die vervolgens wordt geretourneerd door de functie. Ten tweede wordt een andere functie ingesteld die een UInt8-array als parameter opneemt en vervolgens een string uitvoert.

Stap #1. Functie converteer elke byte naar “\u{someNumber}”

func convertToCharacters(#UInt8Bits : UInt8) -> String {

var characterToReturn : String
 switch UInt8Bits{
case 0x00: characterToReturn = "\u{0}"
case 0x01: characterToReturn = "\u{1}"
case 0x02: characterToReturn = "\u{2}"
case 0x03: characterToReturn = "\u{3}"
case 0x04: characterToReturn = "\u{4}"

//.. Voeg zoveel tekens toe als je verwacht…vergeet basis 16 niet..

case 0x09: characterToReturn = "\u{09}"
case 0x0A: characterToReturn = "\u{0A}"
default: characterToReturn = "\u{0}"

/*.. en helemaal tot 0xff */

case 0xFE: characterToReturn = "\u{FE}"
case 0xFF: characterToReturn = "\u{FF}"
  }

return characterToReturn

}

Stap #2 …Vervolgens een functie die een UInt8-array als parameter opneemt en vervolgens een tekenreeks retourneert…

func UInt8ArrayToString(#UInt8Array: [UInt8]) -> String {

var returnString : String = ""
for eachUInt8Byte in UInt8Array {

returnString += convertToCharacter(UInt8Bits: eachUInt8Byte)

}

return returnString
}

Dit zou moeten werken in een Swift Playground
Maak een array

var myArray: [UInt8] = [0x30, 0x3A, 0x4B]

//Pas vervolgens de bovenstaande functies toe

println(UInt8ArrayToString(UInt8Array: myArray))


Antwoord 9

Swift 4 / Ubuntu 16.04

let serverAns = [UInt8](repeating: 0x50, count: 100)
let readBytes = 8
let truncatedServerAns = serverAns[0..<readBytes]
let tsaData = Data(bytes: truncatedServerAns)
let serverIdStr = String(data: tsaData, encoding: .utf8)
print("serverIdStr=\(String( describing: serverIdStr))")
// Prints:
// serverIdStr=Optional("PPPPPPPP")

Antwoord 10

U moet eerst de Int8-array naar Data converteren en vervolgens converteren naar String.

Dit is mijn oplossing:

   var buffer = [Int8](repeating: 0, count: 100)
    let data = Data(bytes: buffer as [Int8], count: buffer.count);
    return String( data: data, encoding: .utf8)

Other episodes