【问题标题】:Swift: extract float from byte dataSwift:从字节数据中提取浮点数
【发布时间】:2014-11-17 15:54:20
【问题描述】:

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

我可以通过这样的方式获得带有位的 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 中将其转换为浮点数的好方法。

例如,在 Java 中:

float f = Float.intBitsToFloat(bits)

或在 C 中:

float f = *(float *)&bits;

我尝试将 dataPtr 强制转换为浮点 UnsafePointer,但是字节顺序是个问题。

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    浮点类型有一个静态_fromBitPattern,它将返回一个值。 &lt;Type&gt;._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()

    【讨论】:

      【解决方案2】:

      等效的 Swift 代码是

      let flt = unsafeBitCast(bits, Float.self)
      

      它会为4.2 提供您的数据。

      【讨论】:

        【解决方案3】:

        这是 Swift 3 的解决方案:

        Float(bitPattern: bits)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-04
          • 1970-01-01
          • 1970-01-01
          • 2018-12-05
          • 1970-01-01
          相关资源
          最近更新 更多