当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在JavaScript中将十进制转换为十六进制?》经验,为你挑选了17个好方法。

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



1> Prestaul..:

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

hexString = yourNumber.toString(16);

并通过以下方式扭转过程:

yourNumber = parseInt(hexString, 16);


如果你不喜欢括号,你可以使用一个额外的点:`42..toString(16)`
在这种情况下,yourNum是十六进制字符串.例如(255).toString(16)=='ff'&& parseInt('ff',16)== 255
@Prestaul"不要浪费cpu周期来解决这个问题" - 这就是所谓的过早优化.除非JavaScript在286上运行,否则我怀疑开销很重要.此外,'45'可能是程序员需要识别的神奇数字(例如超时持续时间,以秒为单位),而'2d',谁会认识到?
@forste,如果你将javascript Number(这是一个Number对象,在ECMA脚本中是一个Double)转换为十六进制并使用这种技术返回,你将不会"松散精度".您链接的问题是专门引用太大而不适合Double的数字(因此问题中的字符串表示).如果你有一个号码,那么这将有效.如果你有一个太大的东西不能成为一个javascript数字对象(一个双),那么你将不得不找到别的东西.
@Derek,我有一个心理问题,不允许我容忍不必要的括号...... @ everyone-else,`yourNumber`是一个变量.如果你想使用数字文字,那么你必须做一些像`(45).toString(16)`的东西,但如果你是硬编码一个数字,那么请你自己把它写成十六进制字符串...... `(45).toString(16)`总是等于''2d',所以不要浪费cpu周期来计算出来.
@CiprianTomoiaga在JavaScript中,所有数字都是浮点数.因此`42`与`42.0`相同.但是省略零并写"42"是合法的.因此,如果你写'42.toString(16)`,那么这段时间不会被视为你试图调用一个函数,而是作为小数点.因此,要实际调用函数,您必须在小数点后添加一个额外的句点
@Derek朕会功夫羞耻你删除了所有的评论.:P会喜欢看完全的讨论.
@Derek,请重读我之前的评论,其中我澄清1)`yourNumber`是一个变量,而不是数字文字,2)为什么你永远不需要输入`(16).toString(16)`
@DejayClayton,我不同意你的意见.过早优化的清晰度/简洁性.但是,我脑海中有两个主要案例.一个是你正在处理二进制/十六进制数据,在这种情况下,写十六进制比写十进制更清楚.(例如'ff'比255更清晰)另一个是你有十六进制编码的数字数据(你的例子),在这种情况下我认为分配数值更明确,直到你需要一个十六进制字符串时才编码.例如(`var timeout = 45; ... doSomething(timeout.toString(16));`)
@ThomasWatson这是什么样的巫术?
你在看`Object.toString`.你需要`Number.toString()`... https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/toString
值得注意的是,这不仅限于十六进制,你也可以使用八进制或二进制与`toString(8)`和`toString(2)` - 以及你应该选择的任何其他基础!
如果您不喜欢括号或多余的圆点,请添加一个空格:`42 .toString(16)`

2> Tod..:

如果需要处理位字段或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));


3> Luke Smith..:

下面的代码将十进制值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;
}


这将无法正确处理负值.decimalToHex(-6,4)将返回00-6.
浮点数也有问题,但是放入Math.round()可以解决该问题。(+1)

4> 小智..:
function toHex(d) {
    return  ("0"+(Number(d).toString(16))).slice(-2).toUpperCase()
}


ES6`const hex = d => Number(d).toString(16).padStart(2,'0')`
这或类似的东西应该是公认的答案.在99%的情况下,您不需要可变长度的十六进制字符串!
这绝对不是接受的答案。1.这是一个令人讨厌的单行代码,很难阅读。导致大量不必要的精神开销。2.其确保不变长度的十六进制字符串的尝试毫无意义,并且仅当您的数字位于单个字节内时才有效(IMO很少见)。

5> 小智..:

填充:

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



6> Alberto..:

完成后,如果您想要负数的二进制补码十六进制表示,则可以使用零填充右移位>>>运算符.例如:

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

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

但是有一个限制:javascript按位运算符将它们的操作数视为32位序列,也就是说,你得到32位二进制补码.


这是迄今为止这个问题最有价值的答案:)

7> 小智..:

没有循环:

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++){}



8> 小智..:

将一些好的想法结合起来用于rgb到hex函数(在其他地方为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);
}



9> Mark Manning..:

接受的答案没有考虑单个数字返回的十六进制代码.这很容易调整:

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

我相信上述答案已被其他人以各种形式多次发布.我将它们包装在一个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"AS A NUMBER放入变量中 - 您将能够得到的只是"3",因为小数部分只能通过重复乘以10(IE:10.0)来访问.或者换句话说 - 十六进制的十六进制值导致FLOATING POINT值在AND运算之前被转换为INTEGER,这将删除该时段背后的所有内容.而不是将值作为一个整体(即:3.14159265)并将FLOATING POINT值与0xf值进行AND运算.因此,在这种情况下,最好的做法是将3.14159265转换为STRING,然后转换字符串.由于上述原因,它也可以很容易地转换负数,因为减号在值的前面只变为0x26.所以我做的是确定变量包含一个数字 - 只需将其转换为字符串并转换字符串.这对每个人来说意味着在服务器端你需要取消传入的字符串,然后确定传入的信息是数字.您只需在数字前面添加"#",然后在返回的字符串前面添加"A"即可轻松完成.请参阅toHex()函数.

玩得开心!

经过一年多的思考,我认为"toHex"功能(我也有"fromHex"功能)确实需要进行改造.整个问题是"我怎样才能更有效地做到这一点?" 我决定一个to/from hex函数不应该关心某个东西是否是一个小数部分,但同时它应该确保小数部分包含在字符串中.那么问题就变成了,"你怎么知道你正在使用十六进制字符串?".答案很简单.使用世界各地已经识别的标准预字符串信息.换句话说 - 使用"0x".所以现在我的toHex函数看看是否已经存在,如果是 - 它只返回发送给它的字符串.否则,它会转换字符串,数字等等.这是修改后的toHex函数:

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

    if (typeof s != "string") {
        s = s.toString();
    }
    for (var i=0; i>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) == "0x") {
        start = 2;
    }

    if (typeof s != "string") {
        s = s.toString();
    }
    for (var i=start; i

与toHex()函数一样,fromHex()函数首先查找"0x",然后将传入的信息转换为字符串(如果它不是字符串).我不知道它不会是一个字符串 - 但以防万一 - 我检查.然后该函数通过,抓取两个字符并将其转换为ascii字符.如果您希望它翻译unicode,您需要将循环更改为一次四(4)个字符.但是你还需要确保字符串不能被四个除.如果是 - 那么它是标准的十六进制字符串.(记住字符串前面有"0x".)

一个简单的测试脚本显示-3.14159265,当转换为字符串时,仍然是-3.14159265.


    Test
        
    
    
    

EOD;

?>

由于Javascript在toString()函数方面的工作原理,所有这些问题都可以在之前导致问题之前消除.现在可以轻松转换所有字符串和数字.此外,诸如对象之类的东西将导致Javascript本身产生错误.我相信这一切都和它一样好.剩下的唯一改进是W3C在Javascript中只包含一个toHex()和fromHex()函数.



10> 小智..:
var number = 3200;
var hexString = number.toString(16);

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



11> Adamarla..:

约束/填充到一定数量的字符:

function decimalToHex(decimal, chars) {
    return (decimal + Math.pow(16, chars)).toString(16).slice(-chars).toUpperCase();
}



12> 小智..:
function dec2hex(i)
{
  var result = "0000";
  if      (i >= 0    && i <= 15)    { result = "000" + i.toString(16); }
  else if (i >= 16   && i <= 255)   { result = "00"  + i.toString(16); }
  else if (i >= 256  && i <= 4095)  { result = "0"   + i.toString(16); }
  else if (i >= 4096 && i <= 65535) { result =         i.toString(16); }
  return result
}


当使用css(或svg,它接受css风格的颜色规范)时,你可以通过编写`color:rgb(r,g,b)`来回避整个问题,其中rg和b是十进制数.

13> korona..:

如果你想将一个数字转换为RGBA颜色值的十六进制表示,我发现这是几个提示的最有用的组合,从这里:

function toHexString(n) {
    if(n < 0) {
        n = 0xFFFFFFFF + n + 1;
    }
    return "0x" + ("00000000" + n.toString(16).toUpperCase()).substr(-8);
}



14> Hat..:

对于任何感兴趣的人,这里有一个JSFiddle比较这个问题的大部分答案.

这是我最终的方法:

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

另外,请记住,如果您希望将CSS从十进制转换为十六进制以用作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-elementCSS color属性设置为rgb(64, 62, 154).



15> Humoyun Ahma..:

好的,答案已经给出,这是免费的.这是一个精简的ES6版本:

const convert = {
  bin2dec : s => parseInt(s, 2).toString(10),
  bin2hex : s => parseInt(s, 2).toString(16),
  dec2bin : s => parseInt(s, 10).toString(2),
  dec2hex : s => parseInt(s, 10).toString(16),
  hex2bin : s => parseInt(s, 16).toString(2),
  hex2dec : s => parseInt(s, 16).toString(10)
};

convert.bin2dec('111'); // '7'
convert.dec2hex('42');  // '2a'
convert.hex2bin('f8');  // '11111000'
convert.dec2bin('22');  // '10110'



16> 小智..:

AFAIK 评论5780​​7是错误的,应该是这样的: var hex = Number(d).toString(16); 而不是 var hex = parseInt(d,16);

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



17> 小智..:

如果数字是负数?

这是我的版本.

function hexdec (hex_string) {
    hex_string=((hex_string.charAt(1)!='X' && hex_string.charAt(1)!='x')?hex_string='0X'+hex_string : hex_string);
    hex_string=(hex_string.charAt(2)<8 ? hex_string =hex_string-0x00000000 : hex_string=hex_string-0xFFFFFFFF-1);
    return parseInt(hex_string, 10);
}

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有