如何在JavaScript中将十进制值转换为十六进制值?


当前回答

将十六进制颜色数字转换为十六进制颜色字符串:

使用toString和ES6 padStart将十六进制颜色数字转换为十六进制颜色字符串的简单解决方案。

const string = `#${color.toString(16).padStart(6, '0')}`;

例如:

0x000000将变为#0000000xFFFFFF将变为#FFFFFF

请在此处仔细检查此示例

其他回答

为了完整起见,如果您想要负数的二进制补码十六进制表示,可以使用零填充右移>>运算符。例如:

> (-1).toString(16)
"-1"

> ((-2)>>>0).toString(16)
"fffffffe"

然而,有一个限制:JavaScript按位运算符将其操作数视为32位的序列,也就是说,您将得到32位2的补码。

下面的代码将十进制值d转换为十六进制。它还允许您向十六进制结果添加填充。因此默认情况下0将变为00。

function decimalToHex(d, padding) {
    var hex = Number(d).toString(16);
    padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding;

    while (hex.length < padding) {
        hex = "0" + hex;
    }

    return hex;
}

如何在JavaScript中将十进制转换为十六进制

我没能找到一个非常干净/简单的十进制到十六进制的转换,它不涉及一堆函数和数组。。。所以我必须自己做这个。

function DecToHex(decimal) { // Data (decimal)

    length = -1;    // Base string length
    string = '';    // Source 'string'

    characters = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ]; // character array

    do { // Grab each nibble in reverse order because JavaScript has no unsigned left shift

        string += characters[decimal & 0xF];   // Mask byte, get that character
        ++length;                              // Increment to length of string

    } while (decimal >>>= 4); // For next character shift right 4 bits, or break on 0

    decimal += 'x'; // Convert that 0 into a hex prefix string -> '0x'

    do
        decimal += string[length];
    while (length--); // Flip string forwards, with the prefixed '0x'

    return (decimal); // return (hexadecimal);
}

/* Original: */

D = 3678;    // Data (decimal)
C = 0xF;    // Check
A = D;        // Accumulate
B = -1;        // Base string length
S = '';        // Source 'string'
H = '0x';    // Destination 'string'

do {
    ++B;
    A& = C;

    switch(A) {
        case 0xA: A='A'
        break;

        case 0xB: A='B'
        break;

        case 0xC: A='C'
        break;

        case 0xD: A='D'
        break;

        case 0xE: A='E'
        break;

        case 0xF: A='F'
        break;

        A = (A);
    }
    S += A;

    D >>>= 0x04;
    A = D;
} while(D)

do
    H += S[B];
while (B--)

S = B = A = C = D; // Zero out variables
alert(H);    // H: holds hexadecimal equivalent

对于任何感兴趣的人,这里有一个JSFiddle比较了这个问题的大多数答案。

下面是我最终采用的方法:

function decToHex(dec) {
  return (dec + Math.pow(16, 6)).toString(16).substr(-6)
}

此外,请记住,如果您希望将十进制转换为十六进制,以便在CSS中用作颜色数据类型,那么您可能更喜欢从十进制中提取RGB值并使用RGB()。

例如(JSFiddle):

let c = 4210330 // your color in decimal format
let rgb = [(c & 0xff0000) >> 16,  (c & 0x00ff00) >> 8,  (c & 0x0000ff)]

// Vanilla JS:
document..getElementById('some-element').style.color = 'rgb(' + rgb + ')'
// jQuery:
$('#some-element').css('color', 'rgb(' + rgb + ')')

这将#some元素的CSS颜色属性设置为rgb(64、62、154)。

我正在一个相当大的循环中转换为十六进制字符串,所以我尝试了几种技术以找到最快的方法。我的要求是得到一个固定长度的字符串,并正确编码负值(-1=>ff..f)。

Simple.toString(16)不适合我,因为我需要正确编码负值。以下代码是迄今为止我在1-2字节值上测试的最快的代码(请注意,符号定义了要获得的输出符号的数量,即对于4字节整数,它应该等于8):

var hex = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
function getHexRepresentation(num, symbols) {
    var result = '';
    while (symbols--) {
        result = hex[num & 0xF] + result;
        num >>= 4;
    }
    return result;
}

它在1-2字节的数字上比.toString(16)执行得更快,在更大的数字上(当符号>=6时)执行得更慢,但仍应优于正确编码负值的方法。