In Swift 4:
Beim Extrahieren eines ganzzahligen Werts aus einem Data
-Stream sind einige Punkte zu beachten. Signigness und Endianess. So kam ich mit einer Funktion in einer Erweiterung zu , die Signedness von dem Typ der Ganzzahl, die Sie extrahieren möchten, und übergibt Endianess und Index
als Parameter. Die Typen von Ganzzahlen, die extrahiert werden können, entsprechen dem FixedWidthInteger
Protokoll.
Erinnerung: Diese Funktion wird nicht überprüfen, ob die Index
Bereich innerhalb der Grenzen des Data
Puffers ist, so dass es abhängig von der Größe des Typs abstürzen kann in Bezug auf das Ende des Puffers extrahiert wird.
extension Data {
enum Endianness {
case BigEndian
case LittleEndian
}
func scanValue<T: FixedWidthInteger>(at index: Data.Index, endianess: Endianness) -> T {
let number: T = self.subdata(in: index..<index + MemoryLayout<T>.size).withUnsafeBytes({ $0.pointee })
switch endianess {
case .BigEndian:
return number.bigEndian
case .LittleEndian:
return number.littleEndian
}
}
}
Beispiel:
let data = Data(bytes: [0xFF,0x1F,0x1F,0xFF])
let number1 = data.scanValue(at: 0, endianess: .LittleEndian) as UInt16
let number2 = data.scanValue(at: 0, endianess: .BigEndian) as UInt16
let number3: Int16 = data.scanValue(at: 2, endianess: .LittleEndian)
let number4: Int16 = data.scanValue(at: 2, endianess: .BigEndian)
Ergebnisse:
number1 is 8191
number2 is 65311
number3 is -225
number4 is 8191
Beobachten Sie die Funktionsaufrufe, um zu sehen, wie der zu extrahierende Typ abgeleitet wird. Natürlich Endianess macht keinen Sinn für Int8
oder UInt8
, aber die Funktion funktioniert wie erwartet.
Werte können später bei Bedarf in Int
umgewandelt werden.
Absolut perfekt! Vielen Dank! – dhint4
oder 'sizeofValue (random)' – newacct
In Swift3: sizeof (NSInteger) wird MemoryLayout .size und println wird gedruckt. –
parleer