swift nsdata

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 }