2014-11-17 25 views
5

Ich bin auf der Suche nach einer robusten und eleganten Möglichkeit, vier Big-Endian-Bytes aus einem Array als Float zu extrahieren.Swift: float aus Byte-Daten extrahieren

Ich kann einen UInt32 mit den Bits über etwas wie diese:

let data: [Byte] = [0x00, 0x00, 0x00, 0x40, 0x86, 0x66, 0x66, 0x00] 
let dataPtr = UnsafePointer<Byte>(data) 
let byteOffset = 3 
let bits = UnsafePointer<UInt32>(dataPtr + byteOffset)[0].bigEndian 

Aber ich kann eine gute Art und Weise nicht herausfinden, diese in einen Float in Swift zu konvertieren.

Zum Beispiel in Java:

float f = Float.intBitsToFloat(bits) 

oder in C:

float f = *(float *)&bits; 

Ich versuchte, die dataPtr mit einem Schwimmer UnsafePointer Gießen, aber dann ist das endianness ein Problem.

Irgendwelche Vorschläge?

Antwort

5

Die Fließkommatypen haben eine statische _fromBitPattern, die einen Wert zurückgibt. <Type>._BitsType ist eine Art Alias ​​für die richtige Größe unsigned integer:

let data: [Byte] = [0x00, 0x00, 0x00, 0x40, 0x86, 0x66, 0x66, 0x00] 
let dataPtr = UnsafePointer<Byte>(data) 
let byteOffset = 3 
let bits = UnsafePointer<Float._BitsType>(dataPtr + byteOffset)[0].bigEndian 
let f = Float._fromBitPattern(bits) 

Sie nicht, dass die Methode in Auto-Vervollständigung sehen, aber es ist ein part of the FloatingPointType protocol. Es gibt eine Instanzmethode, die Ihnen die Bits ._toBitPattern() zurückgibt.

+0

, die besser ist ... –

+0

Ja, noch deutlicher. Vielen Dank! – NickHowes

4

Der äquivalente Swift-Code ist

let flt = unsafeBitCast(bits, Float.self) 

die 4.2 mit Ihren Daten gibt.

0

Hier ist die Lösung für Swift 3:

Float(bitPattern: bits)