Dart 将 IEEE-11073 32 位 FLOAT 转换为简单的双精度

Con*_*ner 0 floating-point ieee dart flutter

我没有太多处理这些低级字节和数字的经验,所以我来这里寻求帮助。我在我的 Flutter 应用程序中连接到蓝牙温度计,根据他们的文档,我得到了一组这样格式的数字。在此处输入图片说明我正在尝试将这些数字转换为普通的双倍温度,但不知道如何转换。这是公司给我的“榜样”。在此处输入图片说明 然而,当我在温度计上得到 98.5 的读数时,我得到一个 [113, 14, 0, 254] 数组的响应

谢谢你的帮助!

ali*_*ias 6

IEEE-11073 是医疗设备中常用的格式。您引用的表格中包含所有内容供您解码数字,尽管一开始可能很难破译。

让我们以你的第一个例子:0xFF00016C。这是一个 32 位数字,第一个字节是指数,最后三个字节是尾数。两者都以 2s 补码表示进行编码:

  • 指数, 0xFF, 在 2 的补码中,这是数字-1
  • 尾数, 0x00016C, 在 2 的补码中,这是数字364

(如果您不太确定如何在 2 的补码中编码数字,请将其作为一个单独的问题提出。)

我们接下来要做的是确保它不是您的表格中规定的“特殊”值。由于您拥有的指数不是0(它是-1),我们知道您没问题。因此,不需要特殊处理。

由于该值并不特殊,因此其数值很简单:mantissa * 10^exponent。所以,我们有:364*10^-1 = 36.4,如您的示例所示。

你的第二个例子是类似的。指数是0xFE,这是-22 的补码中的数字。尾数是0x000D97,它是3479十进制的。同样,指数不是 0,因此不需要特殊处理。所以你有:3479*10^-2 = 34.79

你说这个98.5值,你得到了 byte-array [113, 14, 0, 254]。让我们看看我们是否能理解这一点。你的字节数组,写在十六进制是: [0x71, 0x0E, 0x00, 0xFE]。我猜您以“相反”的顺序接收这些字节,因此作为 32 位十六进制,这实际上是0xFE000E71.

我们类似地进行:指数再次是-2,因为这0xFE是您-2使用 8 位写入2 的补码的方式。(见上文。)尾数0xE71等于3697。所以,数字是3697*10^-2 = 36.97

您声称这实际上是98.5. 我最好的猜测是您正在以华氏度阅读它,而您的设备正在以摄氏度报告。如果您进行数学计算,您会发现36.97C = 98.55F,这已经足够接近了。我不确定你是如何得到这个98.5数字的,但是对于这样的设备,这个结果似乎在你可以预期的精度范围内。

希望这可以帮助!