web-dev-qa-db-fra.com

NSData à [Uint8] dans Swift

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?

59
Bowen Su

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:

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))
103
Arkku

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")

38
sVd

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)
21
Christian Abella

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)
    }
}
18
Maor

Swift 3/4

let data = Data(bytes: [0x01, 0x02, 0x03])
let byteArray: [UInt8] = data.map { $0 }
2
Al Zonke

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
  }
}
0
Rachit Agarwal