如何在Swift中解析蓝牙设备发送的浮动?

在我的iOS应用程序上,我需要解码蓝牙接收的Float值并从另一个设备(不是iOS)获取4个字节,因此我需要一个“便携式”4字节Float格式。 目前,发件人正在使用以下格式:

数据编码:0xCCBBAAEE – 0xEE:指数,1个有符号字节。 – 0xCCBBAA:尾数,3个有符号字节。

我的问题是:如何从这样的Exponent和Mantissa中构造一个(ios)Float?

在iOS中,Float有这个初始化程序:public init(sign:FloatingPointSign,exponent:Int,significand:Float)

我可以很容易地从签名的尾数中得出符号参数,来自带符号的Exponent的Exp参数,但是有效参数采用浮点数,但有效数据参数是浮点数而我只接收3字节的尾数。

假设你正在遵循标准的IEEE格式 ,你真的看起来很难 – 我很难相信你的蓝牙设备会使用其他任何东西 – 然后尝试使用这个初始化器(从Swift 3开始提供):

init( sign: FloatingPointSign, exponentBitPattern: UInt, significandBitPattern: UInt32 ) 

这由BinaryFloatingPoint协议定义:

传递为exponentBitPatternsignificandBitPattern的值以IEEE 754规范定义的二进制交换格式进行解释。

上面针对(单精度) Float提到的IEEE 754是:

  • 符号位:1位
  • 指数宽度:8位
  • 显着精度:24位(明确存储23位)

这个其他Float初始化程序也可以正常工作:

 init(bitPattern: UInt32) 

在这两种情况下,只要注意大与小端的问题,你应该没事;)