如何在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
协议定义:
传递为
exponentBitPattern
和significandBitPattern
的值以IEEE 754规范定义的二进制交换格式进行解释。
上面针对(单精度) Float
提到的IEEE 754是:
- 符号位:1位
- 指数宽度:8位
- 显着精度:24位(明确存储23位)
这个其他Float
初始化程序也可以正常工作:
init(bitPattern: UInt32)
在这两种情况下,只要注意大与小端的问题,你应该没事;)