NSData à dans Swift

Je n’ai pas trouvé de solution à ce problème dans Swift (tous sont des Objective-C, et ils traitent de pointeurs que je ne pense pas exister dans Swift sous la même forme). Est-il possible de convertir un object NSData en un tableau d’octets sous la forme de [Uint8] dans Swift?

Vous pouvez éviter tout d’abord d’initialiser le tableau à des valeurs d’espace réservé, si vous passez par des pointeurs de manière légèrement alambiquée, ou via le nouveau constructeur Array introduit dans 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(data.bytes), count: data.length)) 

C’est drôle mais il existe une solution plus simple. Fonctionne dans Swift 3. Sûrement. Je l’ai utilisé aujourd’hui.

 data: Data // as function parameter let byteArray = [UInt8](data) 

C’est tout! 🙂 NSData facilement reliée aux données.

MISE À JOUR: (en raison du commentaire d’Andrew Koster)

Swift 4.1, Xcode 9.3.1

Juste a été revérifié – tout fonctionne comme prévu.

 if let nsData = NSData(base64Encoded: "VGVzdFN0cmluZw==", options: .ignoreUnknownCharacters) { let bytes = [UInt8](nsData as Data) print(bytes, Ssortingng(bytes: bytes, encoding: .utf8)) 

Sortie: [84, 101, 115, 116, 83, 116, 114, 105, 110, 103] Facultatif (“TestSsortingng”)

Vous pouvez utiliser la fonction getBytes de NSData pour obtenir l’équivalent du tableau d’octets.

Comme vous n’avez fourni aucun code source, j’utiliserai un contenu Swift Ssortingng converti en NSData.

 var ssortingng = "Hello World" let data : NSData! = ssortingng.dataUsingEncoding(NSUTF8SsortingngEncoding) 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) 

Swift 3/4

 let count = data.length / MemoryLayout.size // create an array of Uint8 var byteArray = [UInt8](repeating: 0, count: count) // copy bytes into array data.getBytes(&byteArray, length:count) 

Solution Swift 3+

Données à [octets]

 extension Data { var bytes : [UInt8]{ return [UInt8](self) } } 

[octets] aux données

 extension Array where Element == UInt8 { var data : Data{ return Data(bytes:(self)) } }