NSData
de créer une var
NSData
partir d'un tableau d'octets.
En Obj-C, j'aurais pu faire ceci:
NSData *endMarker = [[NSData alloc] initWithBytes:{ 0xFF, 0xD9 }, length: 2]
Je n'arrive pas à find un équivalent dans Swift.
NSData
a un initialisateur qui prend un pointeur d' bytes
: init(bytes: UnsafeMutablePointer <Void>, length: Int)
. Un paramètre UnsafePointer
peut accepter une variété de choses différentes, y compris un simple tableau Swift, de sorte que vous pouvez utiliser à peu près la même syntaxe que dans Objective-C. Lorsque vous passez le tableau, vous devez vous assurer de l'identifier comme un tableau UInt8
ou l'inférence de type de Swift supposera que vous voulez créer un tableau Int
.
var endMarker = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2)
Vous pouvez en savoir plus sur les parameters de pointeur non sécurisés dans la documentation Interacting with C APIs d' Apple.
var foo : Byte[] = [0xff, 0xD9] var data = NSData(bytes: foo, length: foo.count) println("\(data)")
sorties: ff d9
var data = NSData(bytes: [0xFF, 0xD9] as Byte[], length: 2) println("\(data)")
sorties: ff d9
Edit: Ah, vous devez écrire 'Byte []', alors les résultats sont les mêmes
MISE À JOUR pour Swift 2.2
var foo:[UInt8] = [0xff, 0xD9] var data = NSData(bytes: foo, length: foo.count) print("\(data)")
sorties: ff d9
var data = NSData(bytes: [0xFF, 0xD9] as [UInt8], length: 2) print("\(data)")
sorties: ff d9
Swift 3 extension
extension Data { init<T>(fromArray values: [T]) { var values = values self.init(buffer: UnsafeBufferPointer(start: &values, count: values.count)) } func toArray<T>(type: T.Type) -> [T] { return self.withUnsafeBytes { [T](UnsafeBufferPointer(start: $0, count: self.count/MemoryLayout<T>.ssortingde)) } } }
Usage
let bytes:[UInt8] = [0x00, 0xf4, 0x7c] let data = Data(fromArray: someBytes) print(data as NSData) let bytes = data.toArray(type: UInt8.self) print(bytes)
Vous n'avez pas besoin d'étendre datatables, dans Swift 3, vous pouvez le faire:
let bytes:[UInt8] = [0x00, 0x01, 0x02, 0x03]; let data = Data(bytes: bytes); print(data as NSData);
Impressions "<00010203>"
Pour récupérer le tableau d'octets:
let byteArray:[UInt8] = [UInt8](data)