Dart Convert IEEE-11073 32-битный FLOAT в простой двойной - PullRequest
0 голосов
/ 25 марта 2020

У меня нет большого опыта работы с этими младшими байтами и числами, поэтому я пришел сюда за помощью. Я подключаюсь к bluetooth-термометру в своем приложении Flutter, и получаю массив чисел, отформатированный таким образом, в соответствии с их документацией. enter image description here Я пытаюсь преобразовать эти числа в обычную двойную температуру, но не могу понять, как. Это «пример», который компания дает мне. enter image description here Однако, когда я получаю показание 98,5 на термометре, я получаю ответ в виде массива [113, 14, 0, 254]

Спасибо за любую помощь!

1 Ответ

2 голосов
/ 25 марта 2020

IEEE-11073 - это широко используемый формат в медицинских устройствах. В таблице, которую вы цитировали, есть все для декодирования чисел, хотя на первый взгляд может быть трудно ее расшифровать.

Давайте рассмотрим первый пример, который у вас есть: 0xFF00016C. Это 32-разрядное число, и первый байт является показателем степени, а последние три байта являются мантиссой. Оба кодируются в представлении дополнения 2:

  • Экспонент, 0xFF, в дополнении 2 это число -1
  • Мантисса, 0x00016C, в дополнении 2 это число 364

(Если вы не совсем уверены, как числа кодируются в дополнении 2, задайте это как отдельный вопрос.)

Следующее, что мы делаем чтобы убедиться, что это не «специальное» значение, как указано в вашей таблице. Поскольку у вас есть показатель не 0 (это -1), мы знаем, что вы в порядке. Таким образом, никакой специальной обработки не требуется.

Поскольку значение не является специальным, его значение c просто: mantissa * 10^exponent. Итак, у нас есть: 364*10^-1 = 36.4, как показывает ваш пример.

Ваш второй пример похож. Показатель степени 0xFE, и это число -2 в дополнении 2. Мантисса равна 0x000D97, то есть 3479 в десятичном виде. Опять же, показатель не равен 0, поэтому никакой специальной обработки не требуется. Итак, у вас есть: 3479*10^-2 = 34.79.

Вы говорите для значения 98.5, вы получаете байтовый массив [113, 14, 0, 254]. Давайте посмотрим, сможем ли мы понять это. Ваш байтовый массив, написанный в шестнадцатеричном формате: [0x71, 0x0E, 0x00, 0xFE]. Я предполагаю, что вы получаете эти байты в «обратном» порядке, так что в качестве 32-разрядного шестнадцатеричного числа это на самом деле 0xFE000E71.

Мы действуем аналогично: экспонента снова -2, так как 0xFE это то, как вы пишете -2 в дополнении 2 с использованием 8-бит. (См. Выше.) Мантисса равна 0xE71, что равно 3697. Итак, число: 3697*10^-2 = 36.97.

Вы утверждаете, что на самом деле это 98.5. Я думаю, что вы читаете это в градусах Фаренгейта, а ваше устройство сообщает в градусах Цельсия. Если вы сделаете математику, вы обнаружите, что 36.97C = 98.55F, что достаточно близко. Я не уверен, как вы получили число 98.5, но с такими устройствами, как этот, этот результат, кажется, в точности, как вы можете ожидать.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...