如何在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 评论57807是错误的,应该是这样的: 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); }
对不起,反应旧的线程。