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

在JavaScript中如何将十进制值转换为hex等价值?

将数字转换为hexstring:

hexString = yourNumber.toString(16); 

并通过以下操作反转过程:

 yourNumber = parseInt(hexString, 16); 

如果你需要处理比特字段或32位颜色的东西,那么你需要处理签名的数字。 javascript函数toString(16)将返回一个负数的hex数,通常不是你想要的。 这个函数做了一些疯狂的补充,使其成为一个正数。

 function decimalToHexString(number) { if (number < 0) { number = 0xFFFFFFFF + number + 1; } return number.toString(16).toUpperCase(); } 

下面的代码将十进制值d转换为hex。 它也允许你添加填充到hex结果。 所以默认情况下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() } 

用填充:

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

为了完成,如果您想要一个负数的二进制补码hex表示,您可以使用零填充右移>>>运算符 。 例如:

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

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

没有循环:

 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 

也不是最好不要使用必须评估的循环testing,而不是:

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

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

将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); } 
 var number = 3200; var hexString = number.toString(16); 

16是基数,hex数有16个值:-)

 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 } 

接受的答案没有考虑到单个数字返回的hex代码。 这很容易通过调整:

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

我相信上面的答案已经被其他人以各种forms多次发表了。 我把它们包装在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 ); } } 

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

更新:多次testing这个东西后,我发现一个错误(在RegExp双引号),所以我解决了这个问题。 然而! 经过相当多的testing,并经过almaz的阅读后 – 我意识到我不能得到负面的工作。 进一步 – 我做了一些阅读,因为所有的Javascript数字都存储为64位字,无论如何 – 我试图修改numHex代码来获得64位字。 但事实certificate,你不能那样做。 如果你把“3.14159265”作为一个数字放到一个variables中,所有你将能够得到的是“3”,因为小数部分只能通过将数字乘以十(IE:10.0)重复访问。 或者换句话说 – 0xf的HEX值导致FLOATING POINT值在ANDED之前被转换为INTEGER,从而消除了该段后面的所有内容。 而不是将整个值(即:3.14159265)和浮点值与0xf值进行逻辑与运算。 因此,在这种情况下,最好的做法是将3.14159265转换为STRING,然后转换string。 由于上述原因,还可以轻松地转换负数,因为负号仅在值的前面变为0x26。 所以我所做的是确定该variables包含一个数字 – 只需将其转换为string并转换string。 这对每个人意味着什么,在服务器端,你将需要取消传入的string,然后确定传入的信息是数字。 只需在数字前加一个“#”,然后在返回的string前加“A”即可。 请参阅toHex()函数。

玩的开心!

经过一年多的思考,我决定“toHex”函数(我也有一个“fromHex”函数)真的需要重新修改。 整个问题是“我怎样才能更有效地做到这一点?” 我决定一个hex函数不应该在意是否是小数部分,但同时它应该确保小数部分包含在string中。 那么问题就变成了:“你怎么知道你在用hexstring?”。 答案很简单。 使用世界各地已经被认可的标准的string前信息。 换句话说 – 使用“0x”。 所以,现在我的toHex函数查看是否已经存在,如果是 – 它只是返回发送给它的string。 否则,它会转换string,数字,不pipe。 这里是修改后的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; } 

这是一个非常快速的函数,它考虑了单个数字,浮点数,甚至检查是否要发送一个hex值再次进行hexed。 它只使用四个函数调用,只有两个在循环中。 要取消您使用的值的hex:

 ///////////////////////////////////////////////////////////////////////////// // 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<s.length; i+=2 ){ var c = s.substr( i, 2 ); o = o + String.fromCharCode( parseInt(c, 16) ); } return o; } 

像toHex()函数一样,fromHex()函数首先查找“0x”,然后将input的信息转换为string(如果它不是string)。 我不知道这是不是一个string – 但以防万一 – 我检查。 该function然后通过抓取两个字符并将其转换为ASCII字符。 如果你想要它翻译unicode,你将需要改变循环四个(4)字符一次。 但是,你还需要确保string不能被四个整除。 如果是 – 那么它是一个标准的hexstring。 (记住string前面有“0x”)。

一个简单的testing脚本来显示-3.14159265,当转换为一个string时,仍然是-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()函数方面的工作原理,所有这些问题都可以被消除,而之前的这些问题都是导致问题的原因。 现在所有的string和数字都可以轻松转换。 而且,像对象这样的东西会导致Javascript本身产生错误。 我相信这是一样好。 剩下的唯一改进就是W3C在Javascript中包含toHex()和fromHex()函数。

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

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

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

如果你想把一个数字转换成一个RGBA颜色值的hex表示,我发现这是从这里的几个技巧最有用的组合:

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

对于任何感兴趣的人来说,下面是一个JSFiddle,比较了这个问题的大部分答案 。

以下是我最终select的方法:

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

另外,请记住,如果您希望将十进制转换为hex以在CSS中用作颜色数据types ,则可以改为从小数中提取RGB值,并使用rgb() 。

例如( JSFiddle ):

 var c = 4210330; // your color in decimal format var rgb = [(c & 0xff0000) >> 16, (c & 0x00ff00) >> 8, (c & 0x0000ff)]; // assuming you're using jQuery... $("#some-element").css("color", "rgb(" + rgb + ")"); 

这将#some-element的CSS color属性设置为rgb(64, 62, 154)

如果这个数字是负数?

这是我的版本。

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

您也可以检查以下JsFiddle示例或Stackoverflow JS示例代码。

 'use strict'; var convertBase = function () { function convertBase(baseFrom, baseTo) { return function (num) { return parseInt(num, baseFrom).toString(baseTo); }; } // decimal to hexadecimal convertBase.dec2hex = convertBase(10, 16); return convertBase; }(); alert(convertBase.dec2hex('42')); // '2a' 

我正在做一个很大的循环转换为hexstring,所以我尝试了几种技术,以find最快的一个。 我的要求是有一个固定长度的string作为结果,并正确地编码负值(-1 => ff..f)。

简单.toString(16)不适合我,因为我需要负值进行正确的编码。 下面的代码是迄今为止我testing的最快的1-2个字节值(注意symbols定义了你想要得到的输出符号的数量,也就是说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)更快,而数字更大时(当symbols > = 6时)速度更慢,但仍然应该胜过正确编码负值的方法。

正如接受的答案所述,将十进制转换为hex的最简单方法是var hex = dec.toString(16) 。 但是,您可能更喜欢添加string转换,因为它确保像"12".toString(16)string表示正常工作。

 // avoids a hard to track down bug by returning `c` instead of `12` (+"12").toString(16); 

为了逆转这个过程,你也可以使用下面的解决scheme,因为它更短。

 var dec = +("0x" + hex); 

Google Chrome和Firefox似乎速度较慢,但​​在Opera中速度更快。 见http://jsperf.com/hex-to-dec

总结一下;

 function toHex(i, pad) { if (typeof(pad) === 'undefined' || pad === null) { pad = 2; } var strToParse = i.toString(16); while (strToParse.length < pad) { strToParse = "0" + strToParse; } var finalVal = parseInt(strToParse, 16); if ( finalVal < 0 ) { finalVal = 0xFFFFFFFF + finalVal + 1; } return finalVal; } 

但是,如果你不需要将它转换回最后一个整数(即颜色),那么只要确保值不是负数就足够了。

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

我知道这个问题是旧的,无法find一个残酷的干净/简单的十二进制到hex转换,不涉及function和数组乱七八糟…所以我不得不这样做为我自己。 发布这个帮助任何人寻找这个,知道这将节省我一些时间。 大声笑

 /* Revision: modified coding style, with array instead of a switch. */ function DecToHex( decimal ){ // Data (decimal) length = -1; // Base string length string = ''; // Source 'string' charactor = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ]; // charactor array do { // grab each nibble in reverse order because javscript has no unsigned left shift string += charactor[ decimal & 0xF ]; // mask byte, get that charactor ++length; // incriment to length of string } while( decimal >>>= 4 ); // for next char 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( hexadecial ); } /* 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 hex equivalent 

我知道这个问题已经很老了,但是我还没有find一个明确的答案,没有检查是否是正面的,使用了二的补码(包括负数)。 为此,我将我的解决scheme展示给一个字节:

 ((0xFF + number +1) & 0x0FF).toString(16); 

你可以使用这个指令给任何数字字节,只有你在各自的地方添加FF。 例如,对2个字节:

 ((0xFFFF + number +1) & 0x0FFFF).toString(16); 

如果你想把数组整数转换为stringhex:

 s = ""; for(var i = 0; i < arrayNumber.length; ++i) { s += ((0xFF + arrayNumber[i] +1) & 0x0FF).toString(16); } 

对不起,反应旧的线程。