Me enfrento a problemas al convertir UInt8
Byte array a cadena en swift. He buscado y encontrado una solución simple
String.stringWithBytes(buff, encoding: NSUTF8StringEncoding)
pero muestra el error String.type
no tiene un miembro stringWithBytes
. ¿Puede alguien sugerirme una solución?
Este es mi código donde estoy recibiendo un NSData
y convertido en matriz de bytes y luego tengo que convertir esa matriz de bytes en cadena.
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)
Actualización para Swift 3/Xcode 8:
Cadena de bytes: [UInt8]
:
if let string = String(bytes: bytes, encoding: .utf8) {
print(string)
} else {
print("not a valid UTF-8 sequence")
}
String from datos: Datos
:
let data: Data = ...
if let string = String(data: data, encoding: .utf8) {
print(string)
} else {
print("not a valid UTF-8 sequence")
}
Actualización para Swift 2/Xcode 7:
Cadena de bytes: [UInt8]
:
if let string = String(bytes: bytes, encoding: NSUTF8StringEncoding) {
print(string)
} else {
print("not a valid UTF-8 sequence")
}
String from datos: NSData
:
let data: NSData = ...
if let str = String(data: data, encoding: NSUTF8StringEncoding) {
print(str)
} else {
print("not a valid UTF-8 sequence")
}
Respuesta anterior:
String
no tiene un método stringWithBytes()
.
NSString
tiene un método
NSString(bytes: , length: , encoding: )
que puedes usar, pero puedes crear la cadena directamente desde NSData
, sin necesidad de un array UInt8
:
if let str = NSString(data: data, encoding: NSUTF8StringEncoding) as? String {
println(str)
} else {
println("not a valid UTF-8 sequence")
}
"MSString(bytes: , longitud: , codificación: )" no parece estar funcionando a partir del 26 de julio de 2015.
La conversión de valores de bytes a ASCII parece problemático, si usted ha golpeado una pared se puede hacer de la manera difícil de la siguiente manera (y tal vez me estoy perdiendo algo con swift pero no pude ' t encontrar ninguna solución dentro de mi marco de tiempo.) Esto se hará con dos funciones. La primera función acepta un UInt8 y convierte que a un "\u{}" representación, que luego es devuelto por la función. En segundo lugar, otra función se establece que toma en una matriz UInt8 como parámetro, a continuación, las salidas de una cadena.
Paso #1. Función convertir cada byte a "\u{algúnNúmero}";
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}"
//.. Añade para tantos caracteres como preveas...don't forget base 16..
case 0x09: characterToReturn = "\u{09}"
case 0x0A: characterToReturn = "\u{0A}"
default: characterToReturn = "\u{0}"
/.. y todo el camino hasta 0xff /
case 0xFE: characterToReturn = "\u{FE}"
case 0xFF: characterToReturn = "\u{FF}"
}
return characterToReturn
}
Paso #2 ...A continuación una función que toma un array UInt8 como parámetro y devuelve una cadena...
func UInt8ArrayToString(#UInt8Array: [UInt8]) -> String {
var returnString : String = ""
for eachUInt8Byte in UInt8Array {
returnString += convertToCharacter(UInt8Bits: eachUInt8Byte)
}
return returnCadena
}
Esto debería funcionar en un Playground Swift Crea un array
var myArray : [UInt8] = [0x30, 0x3A, 0x4B]
//Luego aplica las funciones anteriores
println(UInt8ArrayToString(UInt8Array: myArray))