代码之家  ›  专栏  ›  技术社区  ›  Fabian Tjoe A On

在js中将浮点值映射到十六进制范围?

  •  0
  • Fabian Tjoe A On  · 技术社区  · 6 年前

    假设我们有以下情况:

    对于x,最小值为 0x0000 相当于 0.00000 0xffff 相当于 1.00000

    假设我有一个0.6829的值,我如何将它映射到 0x.... 在javascript中?

    编辑 以下内容:

    我之所以需要这个是因为我想通过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+亮度。每个单独的颜色组件在api上都有16位的分辨率。rgb值通过色调桥转换为xy+亮度。

    灯支持的x和y值的分辨率为12位,亮度为11位。这意味着api上的16位分辨率将被截断。

    要在各种类型的灯(即色域)上获得最佳的颜色一致性,最好发送XY+亮度值,因为这些值与硬件无关。

    对于xy,0x0000的最小值等于0.00000,0xffff等于1.00000

    使用的颜色空间格式在消息头的“颜色空间”字节部分中定义。

    1 回复  |  直到 6 年前
        1
  •  2
  •   ChrisG    6 年前

    看起来你只需要把最后的数字分成两个字节:

    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));

    编辑:谢谢,修好了。当然,使用二进制运算符也可以。