Je ne pouvais pas trouver de solution à ce problème dans Swift (tous sont Objective-C, et ils traitent avec des pointeurs que je ne pense pas exister dans Swift sous la même forme). Est-il possible de convertir un objet NSData
en un tableau d'octets sous la forme de [Uint8]
à Swift?
Vous pouvez éviter d’initialiser d’abord le tableau avec les valeurs d’emplacement réservé si vous passez par les pointeurs de manière légèrement compliquée ou via le nouveau constructeur Array
introduit dans 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))
}
Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>(data.bytes), count: data.length))
C'est drôle mais 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 ponté en données.
PDATE: (à cause du commentaire d'Andrew Koster)
Swift 4.1, Xcode 9.3.1
Tout 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, String(bytes: bytes, encoding: .utf8))
Sortie: [84, 101, 115, 116, 83, 116, 114, 105, 110, 103] Facultatif ("TestString")
Vous pouvez utiliser la fonction getBytes
de NSData
pour obtenir l'équivalent du tableau d'octets.
Comme vous n'avez pas fourni de code source, j'utiliserai un contenu Swift String converti en NSData.
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)
Swift 3/4
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 5 Solution
Données en [octets]
extension Data {
var bytes : [UInt8]{
return [UInt8](self)
}
}
[octets] en données
extension Array where Element == UInt8 {
var data : Data{
return Data(self)
}
}
Swift 3/4
let data = Data(bytes: [0x01, 0x02, 0x03])
let byteArray: [UInt8] = data.map { $0 }
Tu peux essayer
extension Data {
func toByteArray() -> [UInt8]? {
var byteData = [UInt8](repeating:0, count: self.count)
self.copyBytes(to: &byteData, count: self.count)
return byteData
}
}