【问题标题】:Working with hex strings and hex values more easily in Javascript在 Javascript 中更轻松地处理十六进制字符串和十六进制值
【发布时间】:2012-06-16 21:34:02
【问题描述】:

我有一些代码接受表示十六进制数字的字符串 - 实际上是十六进制颜色 - 并添加它们。例如,添加 aaaaaa010101 会得到输出 ababab
但是,我的方法似乎不必要地冗长和复杂:

var hexValue = "aaaaaa";
hexValue = "0x" + hexValue;
hexValue = parseInt(hexValue, 16);
hexValue = hexValue + 0x010101;
hexValue = hexValue.toString(16);
document.write(hexValue); // outputs 'ababab'

连接0x后的十六进制值还是一个字符串,所以我得把它改成数字,然后我可以加,然后我得改回来 转换成十六进制格式!如果我要添加的数字是以十六进制字符串开头,或者您考虑到我在这一切开始之前从十六进制颜色中删除了#,则还有更多步骤。

当然有更简单的方法来进行这种简单的十六进制计算!为了清楚起见,我并不是说像(parseInt("0x"+"aaaaaa",16)+0x010101).toString(16) 这样将所有内容放在一行上或使用速记 - 我的意思是实际上做的操作更少。

是否有某种方法可以让 javascript 停止对其所有数学运算使用十进制并改用十六进制?还是有其他方法可以让 JS 更轻松地使用 hex?

【问题讨论】:

  • “让 Javascript 停止对其所有数学运算使用十进制并改用十六进制” - 不可以。 JS 两者都不使用。它实际上是二进制的。您在这里谈论的是字符串。

标签: javascript variables hex


【解决方案1】:

不,没有办法告诉 JavaScript 语言默认使用十六进制整数格式而不是十进制。您的代码尽可能简洁,但请注意,当您将“parseInt”与基数一起使用时,您不需要预先添加“0x”基数指示符。

以下是我将如何解决您的问题:

function addHexColor(c1, c2) {
  var hexStr = (parseInt(c1, 16) + parseInt(c2, 16)).toString(16);
  while (hexStr.length < 6) { hexStr = '0' + hexStr; } // Zero pad.
  return hexStr;
}

addHexColor('aaaaaa', '010101'); // => 'ababab'
addHexColor('010101', '010101'); // => '020202'

【讨论】:

  • 这很整洁。如果将 0x010101 添加到 0xFFFFFF 会发生什么?或者 0x000100 到 0x00FF00 - 你会得到一些奇怪的结果,因为这里实际上有三个八位字节对,它们应该分别与限制 >00
【解决方案2】:

这个怎么样:

var hexValue = "aaaaaa";
hexValue = (parseInt(hexValue, 16) + 0x010101).toString(16);
document.writeln(hexValue); // outputs 'ababab'

如果使用 parseInt,则无需添加 0x 前缀。

【讨论】:

    【解决方案3】:

    我认为接受的答案是错误的。十六进制颜色表示不是线性的。但取而代之的是,R、G 和 B 给出了 3 组两个字符。

    因此,您不能只添加一个整数并期望 RGB 正确添加。

    For Example
    
    n1 = '005500'; <--- green
    n2 = '00ff00'; <--- brighter green
    

    添加这些数字应该会产生更绿的绿色。 无论如何,添加果岭应该增加 RED 来增加。但是通过做公认的答案正在做的事情,例如将整数视为一个数字,那么您将结转加起来大于 f, f+1 = 10 的数字。

    you get `015400` so by adding greens the RED increased .... WRONG
    

    添加 005500 + 00ff00 应该得到,= 00ff00。您不能将更多的绿色添加到最大绿色。

    【讨论】:

    • 你所说的一切都是真的,但我认为这更像是一个评论而不是一个答案,因为你实际上并没有提供这个问题的答案。如果您在此处提供解决方案——如您所描述的那样正确地做到这一点——那么它甚至应该是公认的答案。事实上,我会对此投反对票……如果您将其移至评论或回答问题,我很乐意更改它。
    【解决方案4】:

    对于那些正在寻找一个可以在不超出单个元组范围的情况下添加和减去 HEX 颜色的函数的人,我在几分钟前编写了这个函数来做到这一点:

    export function shiftColor(base, change, direction) {
      const colorRegEx = /^\#?[A-Fa-f0-9]{6}$/;
    
      // Missing parameter(s)
      if (!base || !change) {
        return '000000';
      }
    
      // Invalid parameter(s)
      if (!base.match(colorRegEx) || !change.match(colorRegEx)) {
        return '000000';
      }
    
      // Remove any '#'s
      base = base.replace(/\#/g, '');
      change = change.replace(/\#/g, '');
    
      // Build new color
      let newColor = '';
      for (let i = 0; i < 3; i++) {
        const basePiece = parseInt(base.substring(i * 2, i * 2 + 2), 16);
        const changePiece = parseInt(change.substring(i * 2, i * 2 + 2), 16);
        let newPiece = '';
    
        if (direction === 'add') {
          newPiece = (basePiece + changePiece);
          newPiece = newPiece > 255 ? 255 : newPiece;
        }
        if (direction === 'sub') {
          newPiece = (basePiece - changePiece);
          newPiece = newPiece < 0 ? 0 : newPiece;
        }
    
        newPiece = newPiece.toString(16);
        newPiece = newPiece.length < 2 ? '0' + newPiece : newPiece;
        newColor += newPiece;
      }
    
      return newColor;
    }
    

    您将基本颜色作为参数 1 传递,将更改作为参数 2 传递,然后根据您的意图将“添加”或“子”作为最后一个参数。

    【讨论】:

    • 这应该是公认的答案,它实际上提供了一个可行的解决方案。
    猜你喜欢
    • 2019-07-27
    • 2014-03-07
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2012-12-06
    • 2017-08-20
    相关资源
    最近更新 更多