假设我们有以下内容:
对于x,0x0000
的最小值等于0.00000
,而0xffff
的最小值等于1.00000
假设我的值为0.6829,如何将其映射到Javascript中的0x....
的十六进制值?
编辑:
之所以需要它,是因为我想通过UDP向飞利浦Hue Lights发送消息,有关此问题的文档如下,请注意,我现在使用的是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 + Brightness。每个单独的颜色组件在API上的分辨率均为16位。色相通过色相桥将RGB值转换为xy +亮度。
指示灯支持的x和y值具有12位分辨率,亮度11位。这意味着API的16位分辨率将被截断。
要在各种类型的灯(即色域)上获得最佳的颜色一致性,最好发送xy + Brightness值,因为这些值与硬件无关。
对于xy,最小值0x0000等于0.00000,0xffff等于1.00000
使用的颜色空间格式在消息头的“颜色空间”字节部分中定义。
答案 0 :(得分:2)
看起来您需要做的就是将最终数字分成两个字节:
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));
编辑:谢谢,已修复。当然,使用二进制运算符也可以。