在swift3中更清洁的方式将二进制文件读入Float

时间:2016-09-14 12:43:51

标签: swift pointers swift3

我目前正在这样做:

let floatData: [UInt8] = [0x00, 0x3F, 0xC0, 0x00, 0x00, 0x66, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x66, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x66, 0x00]


floatData.withUnsafeBufferPointer { (bytes: UnsafeBufferPointer<UInt8>) -> Float in
    let byteOffset = 1
    var floatBytes : UInt32 = (UInt32(bytes[byteOffset]) << 24)
    floatBytes |= (UInt32(bytes[byteOffset+1]) << 16)
    floatBytes |= (UInt32(bytes[byteOffset+2]) << 8)
    floatBytes |= UInt32(bytes[byteOffset+3])

    return Float(bitPattern: floatBytes)
}

哪个工作正常,但有点麻烦。我已经尝试将我的字节转换为UnsafeBufferPointer<UInt32>,但编译器不喜欢它。

有没有更简洁的方法来提取我缺少的这种位模式?

由于

1 个答案:

答案 0 :(得分:3)

可能的解决方案:

let byteOffset = 1
let result = Data(bytes: floatData[byteOffset..<byteOffset+4]).withUnsafeBytes {
    (ptr: UnsafePointer<UInt32>) in
    Float(bitPattern: UInt32(bigEndian: ptr.pointee))
}
print(result) // 1.5

Data对象是从数组切片创建的 使用指向数据的指针调用闭包。 ptr.pointee取消引用数据,UInt32(bigEndian:) 将其转换为主机字节顺序。