NSData a[Uint8] en Swift
(7)
Es divertido pero existe una solución más simple. Funciona en Swift 3. Seguramente. He usado esto hoy.
data: Data // as function parameter
let byteArray = [UInt8](data)
¡Eso es todo! :) NSData se unió fácilmente a los datos.
ACTUALIZACIÓN: (debido al comentario de Andrew Koster)
Swift 4.1, Xcode 9.3.1
Solo se ha vuelto a comprobar: todo funciona como se esperaba.
if let nsData = NSData(base64Encoded: "VGVzdFN0cmluZw==", options: .ignoreUnknownCharacters) {
let bytes = [UInt8](nsData as Data)
print(bytes, String(bytes: bytes, encoding: .utf8))
Salida: [84, 101, 115, 116, 83, 116, 114, 105, 110, 103] Opcional ("TestString")
No pude encontrar una solución a este problema en Swift (todos ellos son Objective-C, y tratan con punteros que no creo que existan en Swift de la misma forma).
¿Hay alguna forma de convertir un objeto
NSData
en una matriz de bytes en forma de
[Uint8]
en Swift?
Puede evitar primero inicializar la matriz a valores de marcador de posición, si va a través de punteros de manera ligeramente complicada, o mediante el nuevo constructor de
Array
introducido en Swift 3:
Swift 3
let data = "foo".data(using: .utf8)!
// new constructor:
let array = [UInt8](data)
// …or old style through pointers:
let array = data.withUnsafeBytes {
[UInt8](UnsafeBufferPointer(start: $0, count: data.count))
}
Swift 2
Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>(data.bytes), count: data.length))
Puede usar la función
getBytes
de
NSData
para obtener el conjunto de bytes equivalente.
Como no proporcionó ningún código fuente, usaré un contenido de Swift String que se haya convertido a NSData.
extension Data {
var bytes : [UInt8]{
return [UInt8](self)
}
}
Swift 3/4
extension Array where Element == UInt8 {
var data : Data{
return Data(self)
}
}
Puedes probar
extension Data {
func toByteArray() -> [UInt8]? {
var byteData = [UInt8](repeating:0, count: self.count)
self.copyBytes(to: &byteData, count: self.count)
return byteData
}
}
Swift 4 y datos de imagen a una matriz de bytes.
func getArrayOfBytesFromImage(imageData:Data) ->[UInt8]{ let count = imageData.count / MemoryLayout<UInt8>.size var byteArray = [UInt8](repeating: 0, count: count) imageData.copyBytes(to: &byteArray, count:count) return byteArray }
Solución Swift 5
Datos a [bytes]
var string = "Hello World"
let data : NSData! = string.dataUsingEncoding(NSUTF8StringEncoding)
let count = data.length / sizeof(UInt8)
// create an array of Uint8
var array = [UInt8](count: count, repeatedValue: 0)
// copy bytes into array
data.getBytes(&array, length:count * sizeof(UInt8))
println(array)
[bytes] a datos
let count = data.length / MemoryLayout<UInt8>.size
// create an array of Uint8
var byteArray = [UInt8](repeating: 0, count: count)
// copy bytes into array
data.getBytes(&byteArray, length:count)
Swift 3/4
let data = Data(bytes: [0x01, 0x02, 0x03])
let byteArray: [UInt8] = data.map { $0 }