如何在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() }
填充:
function dec2hex(i) { return (i+0x10000).toString(16).substr(-4).toUpperCase(); }
完成后,如果您想要负数的二进制补码十六进制表示,则可以使用零填充右移位>>>
运算符.例如:
> (-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
也不是最好不要使用必须评估的循环测试,例如,而不是:
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); }
接受的答案没有考虑单个数字返回的十六进制代码.这很容易调整:
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