Отобразить значение с плавающей запятой в шестнадцатеричный диапазон в JS? - PullRequest
0 голосов
/ 24 июня 2018

Допустим, у нас есть следующее:

Для x минимальное значение 0x0000 эквивалентно 0.00000, а 0xffff эквивалентно 1.00000

Давайтескажем, у меня есть значение 0,6829, как мне сопоставить это с шестнадцатеричным значением 0x.... в Javascript?

РЕДАКТИРОВАТЬ :

Причина, по которой мне нужно этопоскольку я хочу отправить сообщение на мой Philips Hue Lights через UDP, соответствующая документация по моему вопросу выглядит следующим образом. Обратите внимание, что теперь я использую цветовое пространство XY вместо RGB:

Пример потокового сообщения:

Example

{

      'H', 'u', 'e', 'S', 't', 'r', 'e', 'a', 'm', //protocol

      0x01, 0x00, //version 1.0

      0x07, //sequence number 7

      0x00, 0x00, //Reserved write 0’s

      0x00, //color mode RGB

      0x00, // Reserved, write 0’s

      0x00, 0x00, 0x01, //light ID 1

      0xff, 0xff, 0x00, 0x00, 0x00, 0x00, //red

      0x00, 0x00, 0x02, //light ID 2

      0x00, 0x00, 0x00, 0x00, 0xff, 0xff //blue

}

Поддерживаемые форматы цветового пространства: RGB и xy + Яркость.Каждый отдельный компонент цвета имеет 16-битное разрешение на API.Значения RGB преобразуются в xy + Brightness с помощью моста Хюэ.

Поддерживаемые лампами значения x и y имеют разрешение 12 бит и яркость 11 бит.Это означает, что 16-битное разрешение API будет усечено.

Чтобы получить наилучшую согласованность цветов для различных типов ламп (т. Е. Гамм), лучше всего отправлять значения xy + Brightness, поскольку они не зависят от аппаратного обеспечения.

Для xy минимальное значение0x0000 эквивалентно 0,00000, а 0xffff эквивалентно 1,00000

Используемый формат цветового пространства определяется в байтовой части «Цветовое пространство» заголовка сообщения.

1 Ответ

0 голосов
/ 24 июня 2018

Похоже, все, что вам нужно, это разделить окончательное число на два байта:

function getBytes(val) {
  const hexVal = Math.round(val * 0xffff);
  const secondByte = hexVal % 0x100;
  const firstByte = (hexVal - secondByte) / 0x100;
  return [firstByte, secondByte];
}

console.log(getBytes(0.6829));

Редактировать: спасибо, исправлено. Конечно, использование бинарных операторов также будет работать.

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