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

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

答案

使用以下命令将数字转换为十六进制字符串:

hexString = yourNumber.toString(16);

并通过以下步骤逆转该过程:

yourNumber = parseInt(hexString, 16);

如果需要处理位字段或 32 位颜色之类的内容,则需要处理带符号的数字。 JavaScript 函数toString(16)将返回一个十六进制负数,通常这不是您想要的。此功能做了一些疯狂的添加,使其成为正数。

function decimalToHexString(number)
{
  if (number < 0)
  {
    number = 0xFFFFFFFF + number + 1;
  }

  return number.toString(16).toUpperCase();
}

console.log(decimalToHexString(27));
console.log(decimalToHexString(48.6));

下面的代码将十进制值 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;
}
function toHex(d) {
    return  ("0"+(Number(d).toString(16))).slice(-2).toUpperCase()
}

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

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

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

但是,存在一个局限性: JavaScript 按位运算符将其操作数视为 32 位序列 ,也就是说,您获得了 32 位二进制补码。

带填充:

function dec2hex(i) {
   return (i+0x10000).toString(16).substr(-4).toUpperCase();
}

没有循环:

function decimalToHex(d) {
  var hex = Number(d).toString(16);
  hex = "000000".substr(0, 6 - hex.length) + hex;
  return hex;
}

// Or "#000000".substr(0, 7 - hex.length) + hex;
// Or whatever
// *Thanks to MSDN

另外,不使用必须进行评估的回路测试是否更好?

例如,代替:

for (var i = 0; i < hex.length; i++){}

for (var i = 0, var j = hex.length; i < j; i++){}

将这些好点子结合起来,实现 RGB 值到十六进制的功能(在其他地方为 HTML / CSS 添加# ):

function rgb2hex(r,g,b) {
    if (g !== undefined)
        return Number(0x1000000 + r*0x10000 + g*0x100 + b).toString(16).substring(1);
    else
        return Number(0x1000000 + r[0]*0x10000 + r[1]*0x100 + r[2]).toString(16).substring(1);
}

接受的答案未考虑返回的一位数字的十六进制代码。这很容易通过以下方式进行调整:

function numHex(s)
{
    var a = s.toString(16);
    if ((a.length % 2) > 0) {
        a = "0" + a;
    }
    return a;
}

function strHex(s)
{
    var a = "";
    for (var i=0; i<s.length; i++) {
        a = a + numHex(s.charCodeAt(i));
    }

    return a;
}

我相信以上答案已经被其他人以一种或另一种形式发布了无数次。我将它们包装在 toHex()函数中,如下所示:

function toHex(s)
{
    var re = new RegExp(/^\s*(\+|-)?((\d+(\.\d+)?)|(\.\d+))\s*$/);

    if (re.test(s)) {
        return '#' + strHex( s.toString());
    }
    else {
        return 'A' + strHex(s);
    }
}

请注意,数字正则表达式来自10 多个有用的 JavaScript 正则表达式函数,以提高 Web 应用程序的效率

更新:经过几次测试,我发现了一个错误(RegExp 中的双引号),因此我将其修复。然而!经过大量的测试并阅读了 almaz 的帖子 - 我意识到我无法获得负数来工作。

进一步 - 我做了一些阅读,并且由于所有 JavaScript 数字无论如何都存储为 64 位字 - 我试图修改 numHex 代码以获取 64 位字。但是事实证明您不能做到这一点。如果将 “3.14159265” 作为数字放入变量中,则只能获得 “3”,因为小数部分只能通过将数字重复乘以 10(IE:10.0)来访问。或者换种说法 - 十六进制值 0xF 导致将浮点值与 AND 运算之前转换为整数 ,从而删除了句点之后的所有内容。而不是将值作为一个整体(即:3.14159265)并将浮点值与 0xF 值进行 “与” 运算

因此,在这种情况下,最好的做法是将 3.14159265 转换为字符串 ,然后仅转换该字符串。由于上述原因,这也使转换负数变得容易,因为减号仅在值的前面变为 0x26。

因此,我所做的就是确定该变量包含一个数字 - 只需将其转换为字符串并转换为字符串即可。对每个人来说,这意味着在服务器端,您将需要对输入的字符串进行十六进制解析,然后确定输入的信息是数字。您只需在数字前面加上 “#”,然后在返回的字符串前面加上 “A”,就可以轻松地做到这一点。请参见 toHex()函数。

玩得开心!

又过了一年又经过了很多思考,我认为确实需要对 “toHex” 功能(还有一个 “fromHex” 功能)进行改进。整个问题是 “我如何才能更有效地做到这一点?” 我认为 to / from 十六进制函数不应该关心某些东西是否是小数部分,但同时应确保小数部分包含在字符串中。

因此,问题就变成了 “您怎么知道您正在使用十六进制字符串?”。答案很简单。使用世界各地已经公认的标准预字符串信息。

换句话说 - 使用 “0x”。因此,现在我的 toHex 函数将查看是否已经存在,并且已经存在 - 它只是返回发送给它的字符串。否则,它将转换字符串,数字等。这是修改后的 toHex 函数:

/////////////////////////////////////////////////////////////////////////////
//  toHex().  Convert an ASCII string to hexadecimal.
/////////////////////////////////////////////////////////////////////////////
toHex(s)
{
    if (s.substr(0,2).toLowerCase() == "0x") {
        return s;
    }

    var l = "0123456789ABCDEF";
    var o = "";

    if (typeof s != "string") {
        s = s.toString();
    }
    for (var i=0; i<s.length; i++) {
        var c = s.charCodeAt(i);

        o = o + l.substr((c>>4),1) + l.substr((c & 0x0f),1);
    }

    return "0x" + o;
}

这是一个非常快速的功能,它考虑了个位数,浮点数,甚至检查该人是否正在发送一个十六进制值以再次被十六进制化。它仅使用四个函数调用,并且其中只有两个在循环中。要取消十六进制,请使用:

/////////////////////////////////////////////////////////////////////////////
//  fromHex().  Convert a hex string to ASCII text.
/////////////////////////////////////////////////////////////////////////////
fromHex(s)
{
    var start = 0;
    var o = "";

    if (s.substr(0,2).toLowerCase() == "0x") {
        start = 2;
    }

    if (typeof s != "string") {
        s = s.toString();
    }
    for (var i=start; i<s.length; i+=2) {
        var c = s.substr(i, 2);

        o = o + String.fromCharCode(parseInt(c, 16));
    }

    return o;
}

与 toHex()函数类似,fromHex()函数首先查找 “0x”,然后将输入的信息转换为字符串(如果还不是字符串的话)。我不知道它不是字符串 - 但以防万一 - 我检查一下。然后,该函数执行,抓取两个字符并将其转换为 ASCII 字符。如果要转换 Unicode,则需要将循环更改为一次四(4)个字符。但是然后,您还需要确保字符串不能被四整除。如果是 - 则它是标准的十六进制字符串。 (请记住,该字符串的前面带有 “0x”。)

一个简单的测试脚本显示 - 3.14159265 转换为字符串时仍为 - 3.14159265。

<?php

    echo <<<EOD
<html>
    <head><title>Test</title>
        <script>
            var a = -3.14159265;
            alert( "A = " + a );
            var b = a.toString();
            alert( "B = " + b );
        </script>
    </head>
    <body>
    </body>
</html>
EOD;

?>

由于 JavaScript 关于 toString()函数的工作方式,因此可以消除以前引起问题的所有这些问题。现在,所有字符串和数字都可以轻松转换。此外,诸如对象之类的东西将导致 JavaScript 本身生成错误。我相信这差不多。 W3C 剩下的唯一改进就是在 JavaScript 中仅包含 toHex()和 fromHex()函数。

var number = 3200;
var hexString = number.toString(16);

16 是基数,十六进制数中有 16 个值:-)