Swift:从字节数据中提取浮点数

时间:2014-11-17 15:54:21

标签: swift type-conversion floating-point-conversion

我正在寻找一种强大而优雅的方法来从数组中提取四个大端字节作为Float。

我可以通过以下方式获得带有位的UInt32:

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

但我无法想出一个很好的方法将它转换为Swift中的Float。

例如,在Java中:

float f = Float.intBitsToFloat(bits)

或在C:

float f = *(float *)&bits;

我尝试将dataPtr转换为浮点UnsafePointer,但是endianness是一个问题。

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

浮点类型具有静态_fromBitPattern,它将返回一个值。 <Type>._BitsType是正确大小的无符号整数的类型别名:

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)

您在自动完成时看不到该方法,但它只是part of the FloatingPointType protocol。有一个实例方法会返回这些位,称为._toBitPattern()

答案 1 :(得分:4)

等效的Swift代码是

let flt = unsafeBitCast(bits, Float.self)

4.2提供了您的数据。

答案 2 :(得分:0)

这是Swift 3的解决方案:

Float(bitPattern: bits)