string swift hex nsdata swift2

string - NSData de cadena hexadecimal?



swift swift2 (2)

Sé que esta pregunta se ha formulado para ObjectiveC , pero mi Swift no es lo suficientemente fuerte como para transcribir las cosas de char *bytes .

Así que dado

let string = "600DBEEF"

¿Cómo creo un NSData que represente esos 4 bytes: 60 0D BE EF ?


Respuesta rápida, XCode beta 6

let string = "600DBEEF" let length = string.characters.count let rawData = UnsafeMutablePointer<CUnsignedChar>.alloc(length/2) var rawIndex = 0 for var index = 0; index < length; index+=2{ let single = NSMutableString() single.appendString(string.substringWithRange(Range(start:string.startIndex.advancedBy(index), end:string.startIndex.advancedBy(index+2)))) rawData[rawIndex] = UInt8(single as String, radix:16)! rawIndex++ } let data:NSData = NSData(bytes: rawData, length: length/2) rawData.dealloc(length/2)


Con la llegada de Swift3 y el nuevo tipo de datos de Foundation, finalmente volví a este:

extension UnicodeScalar { var hexNibble:UInt8 { let value = self.value if 48 <= value && value <= 57 { return UInt8(value - 48) } else if 65 <= value && value <= 70 { return UInt8(value - 55) } else if 97 <= value && value <= 102 { return UInt8(value - 87) } fatalError("/(self) not a legal hex nibble") } } extension Data { init(hex:String) { let scalars = hex.unicodeScalars var bytes = Array<UInt8>(repeating: 0, count: (scalars.count + 1) >> 1) for (index, scalar) in scalars.enumerated() { var nibble = scalar.hexNibble if index & 1 == 0 { nibble <<= 4 } bytes[index >> 1] |= nibble } self = Data(bytes: bytes) } }

Ahora puedo construir objetos de datos de forma similar a su forma impresa:

Data(hex: "600dBeef")