2017-06-04 5 views
0

Ich möchte UInt16 zu UInt8 Array konvertieren, aber die folgende Fehlermeldung bin immer:Wie konvertiert man UInt16 zu UInt8 in Swift 3?

‚init‘ steht nicht zur Verfügung: Verwendung ‚withMemoryRebound (an: Kapazität: _)‘ zu vorübergehend Speicher als ein anderes Layout-Ansicht -kompatibler Typ

Der Code:

let statusByte: UInt8 = UInt8(status) 
    let lenghtByte: UInt16 = UInt16(passwordBytes.count) 

    var bigEndian = lenghtByte.bigEndian 

    let bytePtr = withUnsafePointer(to: &bigEndian) { 
     UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: MemoryLayout.size(ofValue: bigEndian)) 
    } 

Antwort

3

Wie die Fehlermeldung anzeigt, müssen Sie withMemoryRebound() verwenden Sie den Zeiger auf UInt16 als Zeiger auf UInt8 neu zu interpretieren:

let bytes = withUnsafePointer(to: &bigEndian) { 
    $0.withMemoryRebound(to: UInt8.self, capacity: MemoryLayout.size(ofValue: bigEndian)) { 
     Array(UnsafeBufferPointer(start: $0, count: MemoryLayout.size(ofValue: bigEndian))) 
    } 
} 

Die Verschlüsse werden mit Zeigern aufgerufen ($0), die nur sind Gültig für die Lebensdauer des Verschlusses und darf nicht nach außen für die spätere Verwendung übergeben werden. Deshalb wird eine Array erstellt und als Rückgabewert verwendet.

Es gibt eine einfachere Lösung jedoch:

let bytes = withUnsafeBytes(of: &bigEndian) { Array($0) } 

Erläuterung:withUnsafeBytes ruft den Verschluss mit einem UnsafeRawBufferPointer auf die Speicherung der bigEndian variabel. Da UnsafeRawBufferPointer ein Sequence von UInt8 ist, kann ein Array daraus mit Array($0) erstellt werden.

3

Sie können Integer-Protokoll erweitern und eine Dateneigenschaft wie folgt erstellen:

extension Integer { 
    var data: Data { 
     var source = self 
     return Data(bytes: &source, count: MemoryLayout<Self>.size) 
    } 
} 

In Swift 3 Daten zu MutableCollection entspricht, so dass Sie nur ein Array erstellen von Bytes von Ihren UInt16-Daten:

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

let lenghtByte = UInt16(8) 
let bytePtr = lenghtByte.bigEndian.data.array // [0, 8] 
Verwandte Themen