NSData a String en problemas de Swift

Tengo problemas para convertir rápidamente mi NSData en NSString. Estoy usando lo que creo que es el command y el formatting correctos: NSString(data: <DATA>, encoding: <ENCODING>) sin embargo, hagas lo que sea que hago, sigo terminando con un valor nulo. Estoy ejecutando la versión beta de Xcode más reciente, así que no estoy seguro de si eso está relacionado, pero espero que sea un error sencillo y sencillo con el que me he topado.

Adjunto el código del patio de recreo, así como una captura de pantalla.

Código del patio de juegos para Xcode 6.3 Beta 2 Build (6D532l)

 import Foundation //: # NSData to String Conversion Playground //: ### Step 1 //: The first step is to take an array of bytes and conver them into a NSData object. The bytes are as follows: var testBytes : [UInt8] = [0x14, 0x00, 0xAB, 0x45, 0x49, 0x1F, 0xEF, 0x15, 0xA8, 0x89, 0x78, 0x0F, 0x09, 0xA9, 0x07, 0xB0, 0x01, 0x20, 0x01, 0x4E, 0x38, 0x32, 0x35, 0x56, 0x20, 0x20, 0x20, 0x00] //: ### Step 2 //: Convert the byte array into an **NSData** Object var immutableData = NSData(bytes: testBytes, length: testBytes.count) //: ### Step 3 //: Attempt to convert the **NSData** object into a string so it can be sent around as ascii. This for some reason seems to be failing, however. var convertedString = NSString(data: immutableData, encoding: NSUTF8StringEncoding) println("String = \(convertedString)") 

Resultados de Playgound

introduzca la descripción de la imagen aquí

 let testBytes : [UInt8] = [0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64] func bytes2String(array:[UInt8]) -> String { return String(data: NSData(bytes: array, length: array.count), encoding: NSUTF8StringEncoding) ?? "" } 

Xcode 8.2 • Swift 3.0.2

 func bytes2String(_ array: [UInt8]) -> String { return String(data: Data(bytes: array, count: array.count), encoding: .utf8) ?? "" } 

Pruebas:

 bytes2String(testBytes) // "Hello World" 

¡Utiliza caracteres UTF8 válidos!

 // Playground - noun: a place where people can play import UIKit var str = "Hello, playground" import Foundation //: # NSData to String Conversion Playground //: ### Step 1 //: The first step is to take an array of bytes and conver them into a NSData object. The bytes are as follows: // Hello World var testBytes : [UInt8] = [0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64] //: ### Step 2 //: Convert the byte array into an **NSData** Object var immutableData = NSData(bytes: testBytes, length: testBytes.count) //: ### Step 3 //: Attempt to convert the **NSData** object into a string so it can be sent around as ascii. This for some reason seems to be failing, however. var convertedString = NSString(data: immutableData, encoding: NSUTF8StringEncoding) println("String = \(convertedString)") 

Su salida será: "String = Optional(Hello World)"

Si solo quieres valores hexadecimales en cadena:

Solo quiero una cadena de los valores hexadecimales. ¡Supongo que esto está tratando de decodificar como ascii real! Duh! – Jeef 4 de mar a las 23:29

La forma más fácil de hacerlo es simplemente usar Swifts incorporados en la interpolación de cadenas.

  let myHexString = "\(myNSDataObject)" 

Esto le dará una cadena de hexadecimal con espacios entre cada dos caracteres y rodeado de corchetes. Me gusta esto:

  <a0 ff 21 4a> 

Podría formatearlo con los methods de cadena incorporados:

  myHexString.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>")).stringByReplacingOccurrencesOfString(" ", withString: "") 

Entonces tendrás una cadena que contiene: a0ff214a

Usando UTF8 en Swift 3.0

  let testBytes : [UInt8] = [0x14, 0x00, 0xAB, 0x45, 0x49, 0x1F, 0xEF, 0x15, 0xA8, 0x89, 0x78, 0x0F, 0x09, 0xA9, 0x07, 0xB0, 0x01, 0x20, 0x01, 0x4E, 0x38, 0x32, 0x35, 0x56, 0x20, 0x20, 0x20, 0x00] let immutableData = NSData(bytes: testBytes, length: testBytes.count) let convertedString = NSString(data: (immutableData as NSData) as Data, encoding:String.Encoding.utf8.rawValue) print("String = \(convertedString)") 
  var tokenString:String = deviceToken.description.stringByTrimmingCharactersInSet(NSCharacterSet.init(charactersInString: "<>")) tokenString = tokenString.stringByReplacingOccurrencesOfString(" ", withString: "")