如何在 JavaScript 中将十进制值转换为十六进制等效值?
将数字转换为十六进制字符串:
hexString = yourNumber.toString(16);
并通过以下方式反转该过程:
yourNumber = parseInt(hexString, 16);
如果您需要处理位域或 32 位颜色等内容,则需要处理带符号的数字。 JavaScript 函数 toString(16)
将返回一个负的十六进制数,这通常不是您想要的。这个函数做了一些疯狂的加法,使它成为一个正数。
函数 decimalToHexString(number) { if (number < 0) { number = 0xFFFFFFFF + number + 1; } 返回 number.toString(16).toUpperCase(); } console.log(decimalToHexString(27)); console.log(decimalToHexString(48.6));
number = 0x100000000 + number;
>>>
运算符将数字转换为无符号表示,例如 ((-3253) >>> 0).toString(16)
返回 "fffff34b"
。
+1
是一个有用的加法,但如果您将数字转换为不同的符号,则所有数字“通常”已经是正数,否则您需要负数结果。
下面的代码会将十进制值 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 hexRep(number, width) { return (number+Math.pow(16, precision)).toString(16).slice(-width); }
const hex = d => Number(d).toString(16).padStart(2, '0')
😁
为了完整起见,如果您想要负数的 two's-complement 十六进制表示,您可以使用 zero-fill-right shift >>>
operator。例如:
> (-1).toString(16)
"-1"
> ((-2)>>>0).toString(16)
"fffffffe"
但是有一个限制:JavaScript bitwise operators treat their operands as a sequence of 32 bits,也就是说,您得到的是 32 位二进制补码。
C# number to hexadecimal
产生的结果与 Javascript number to hexadecimal
不同。看起来Javascript有负数的问题。这个答案似乎是解决问题的方法。
((-2)>>>0).toString(16).substring(2)
带填充:
function dec2hex(i) {
return (i+0x10000).toString(16).substr(-4).toUpperCase();
}
接受的答案没有考虑返回的单个数字十六进制代码。这很容易通过以下方式调整:
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+ Useful JavaScript Regular Expression Functions to improve your web applications efficiency。
更新:在多次测试这个东西后,我发现了一个错误(RegExp 中的双引号),所以我修复了它。然而!经过大量测试并阅读了 almaz 的帖子后,我意识到我无法让负数起作用。
此外 - 我对此进行了一些阅读,因为无论如何所有 JavaScript 数字都存储为 64 位字 - 我尝试修改 numHex 代码以获取 64 位字。但事实证明你不能那样做。如果您将“3.14159265”作为数字放入变量中 - 您将能够得到的只是“3”,因为小数部分只能通过重复将数字乘以十(IE:10.0)来访问。或者换一种说法 - 0xF 的十六进制值导致浮点值在它被“与”之前被转换为整数,这会删除句点后面的所有内容。而不是将值作为一个整体(即:3.14159265)并将浮点值与 0xF 值进行与运算。
因此,在这种情况下,最好的做法是将 3.14159265 转换为字符串,然后再转换字符串。由于上述原因,负数的转换也很容易,因为减号正好变成了值前面的 0x26。
所以我所做的是确定变量包含一个数字 - 只需将其转换为字符串并转换字符串。这对每个人来说意味着,在服务器端,您需要对传入的字符串进行 unhex,然后确定传入的信息是数字的。您只需在数字前面添加“#”,在返回的字符串前面添加“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() 函数。
if (typeof s != "string")
之前的 if( s.substr(0,2)
可能不是您想要的。我返回的结果也不是我所期望的(toHex(0x1f635)
给出了 "0x313238353635"
)。没有进一步调查。
substr
& toLowerCase
在非字符串上...所以要么 typeof
需要尽快出现,或者,如果您希望 toHex
在此处抛出非字符串,则应完全删除 typeof
检查。说得通?也就是说,如果我使用此处的代码而不进行编辑,并调用 toHex(0x1f635)
,我会得到 Uncaught TypeError: s.substr is not a function
。如果我更早地移动字符串,你是对的,数字首先转换为十进制,也许,事情就横向发展了。这当然意味着如果 s
不是字符串,您不能在这里进行简单的转换。
没有循环:
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 decimalToHex(decimal, chars) {
return (decimal + Math.pow(16, chars)).toString(16).slice(-chars).toUpperCase();
}
对于任何感兴趣的人,here's a JSFiddle comparing most of the answers given to this question。
这是我最终采用的方法:
function decToHex(dec) {
return (dec + Math.pow(16, 6)).toString(16).substr(-6)
}
此外,请记住,如果您希望将十进制转换为十六进制以在 CSS 中用作 color data type,您可能更愿意从十进制中提取 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-element
的 CSS color
属性设置为 rgb(64, 62, 154)
。
var number = 3200;
var hexString = number.toString(16);
16 是基数,十六进制数中有 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
}
color: rgb(r,g,b)
来回避整个问题,其中 rg 和 b 是十进制数。
function decimalToHexString(i) { var result = "00"; 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 }
如果您想将数字转换为 RGBA 颜色值的十六进制表示,我发现这是以下几个技巧的最有用组合:
function toHexString(n) {
if(n < 0) {
n = 0xFFFFFFFF + n + 1;
}
return "0x" + ("00000000" + n.toString(16).toUpperCase()).substr(-8);
}
AFAIK comment 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 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);
}
正如公认的答案所述,从十进制转换为十六进制的最简单方法是 var hex = dec.toString(16)
。但是,您可能更喜欢添加字符串转换,因为它可以确保像 "12".toString(16)
这样的字符串表示可以正常工作。
// Avoids a hard-to-track-down bug by returning `c` instead of `12`
(+"12").toString(16);
要扭转这个过程,您也可以使用下面的解决方案,因为它更短。
var dec = +("0x" + hex);
在 Google Chrome 和 Firefox 中它似乎更慢,但在 Opera 中明显更快。请参阅http://jsperf.com/hex-to-dec。
我正在一个非常大的循环中转换为十六进制字符串,所以我尝试了几种技术以找到最快的一种。我的要求是得到一个固定长度的字符串,并正确编码负值(-1 => ff..f)。
简单的 .toString(16)
对我不起作用,因为我需要正确编码负值。以下代码是迄今为止我在 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 时),但仍应优于正确编码负值的方法。
如何在 JavaScript 中将十进制转换为十六进制
我无法找到一个不涉及大量函数和数组的非常干净/简单的十进制到十六进制转换......所以我不得不为自己做这个。
function DecToHex(decimal) { // Data (decimal)
length = -1; // Base string length
string = ''; // Source 'string'
characters = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ]; // character array
do { // Grab each nibble in reverse order because JavaScript has no unsigned left shift
string += characters[decimal & 0xF]; // Mask byte, get that character
++length; // Increment to length of string
} while (decimal >>>= 4); // For next character 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 (hexadecimal);
}
/* 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 hexadecimal equivalent
如果您正在寻找转换大整数,即大于 Number.MAX_SAFE_INTEGER -- 9007199254740991 的数字,那么您可以使用以下代码
const hugeNumber = "9007199254740991873839" // 确保它在 String 中 const hexOfHugeNumber = BigInt(hugeNumber).toString(16); console.log(hexOfHugeNumber)
总结一下;
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;
}
但是,如果您不需要在最后将其转换回整数(即颜色),那么只需确保值不是负数就足够了。
我还没有找到一个明确的答案,没有检查它是负数还是正数,它使用二进制补码(包括负数)。为此,我将我的解决方案展示为一个字节:
((0xFF + number +1) & 0x0FF).toString(16);
您可以将此指令用于任意数量的字节,只需在相应位置添加 FF
。例如,到两个字节:
((0xFFFF + number +1) & 0x0FFFF).toString(16);
如果要将数组整数转换为十六进制字符串:
s = "";
for(var i = 0; i < arrayNumber.length; ++i) {
s += ((0xFF + arrayNumber[i] +1) & 0x0FF).toString(16);
}
如果您希望转换为“完整”的 JavaScript 或 CSS 表示形式,您可以使用以下内容:
numToHex = function(num) {
var r=((0xff0000&num)>>16).toString(16),
g=((0x00ff00&num)>>8).toString(16),
b=(0x0000ff&num).toString(16);
if (r.length==1) { r = '0'+r; }
if (g.length==1) { g = '0'+g; }
if (b.length==1) { b = '0'+b; }
return '0x'+r+g+b; // ('#' instead of'0x' for CSS)
};
var dec = 5974678;
console.log( numToHex(dec) ); // 0x5b2a96
这是基于 Prestaul 和 Tod 的解决方案。然而,这是一个解释变量大小变化的概括(例如,从微控制器串行日志中解析有符号值)。
function decimalToPaddedHexString(number, bitsize)
{
let byteCount = Math.ceil(bitsize/8);
let maxBinValue = Math.pow(2, bitsize)-1;
/* In node.js this function fails for bitsize above 32bits */
if (bitsize > 32)
throw "number above maximum value";
/* Conversion to unsigned form based on */
if (number < 0)
number = maxBinValue + number + 1;
return "0x"+(number >>> 0).toString(16).toUpperCase().padStart(byteCount*2, '0');
}
测试脚本:
for (let n = 0 ; n < 64 ; n++ ) {
let s=decimalToPaddedHexString(-1, n);
console.log(`decimalToPaddedHexString(-1,${(n+"").padStart(2)}) = ${s.padStart(10)} = ${("0b"+parseInt(s).toString(2)).padStart(34)}`);
}
试验结果:
decimalToPaddedHexString(-1, 0) = 0x0 = 0b0
decimalToPaddedHexString(-1, 1) = 0x01 = 0b1
decimalToPaddedHexString(-1, 2) = 0x03 = 0b11
decimalToPaddedHexString(-1, 3) = 0x07 = 0b111
decimalToPaddedHexString(-1, 4) = 0x0F = 0b1111
decimalToPaddedHexString(-1, 5) = 0x1F = 0b11111
decimalToPaddedHexString(-1, 6) = 0x3F = 0b111111
decimalToPaddedHexString(-1, 7) = 0x7F = 0b1111111
decimalToPaddedHexString(-1, 8) = 0xFF = 0b11111111
decimalToPaddedHexString(-1, 9) = 0x01FF = 0b111111111
decimalToPaddedHexString(-1,10) = 0x03FF = 0b1111111111
decimalToPaddedHexString(-1,11) = 0x07FF = 0b11111111111
decimalToPaddedHexString(-1,12) = 0x0FFF = 0b111111111111
decimalToPaddedHexString(-1,13) = 0x1FFF = 0b1111111111111
decimalToPaddedHexString(-1,14) = 0x3FFF = 0b11111111111111
decimalToPaddedHexString(-1,15) = 0x7FFF = 0b111111111111111
decimalToPaddedHexString(-1,16) = 0xFFFF = 0b1111111111111111
decimalToPaddedHexString(-1,17) = 0x01FFFF = 0b11111111111111111
decimalToPaddedHexString(-1,18) = 0x03FFFF = 0b111111111111111111
decimalToPaddedHexString(-1,19) = 0x07FFFF = 0b1111111111111111111
decimalToPaddedHexString(-1,20) = 0x0FFFFF = 0b11111111111111111111
decimalToPaddedHexString(-1,21) = 0x1FFFFF = 0b111111111111111111111
decimalToPaddedHexString(-1,22) = 0x3FFFFF = 0b1111111111111111111111
decimalToPaddedHexString(-1,23) = 0x7FFFFF = 0b11111111111111111111111
decimalToPaddedHexString(-1,24) = 0xFFFFFF = 0b111111111111111111111111
decimalToPaddedHexString(-1,25) = 0x01FFFFFF = 0b1111111111111111111111111
decimalToPaddedHexString(-1,26) = 0x03FFFFFF = 0b11111111111111111111111111
decimalToPaddedHexString(-1,27) = 0x07FFFFFF = 0b111111111111111111111111111
decimalToPaddedHexString(-1,28) = 0x0FFFFFFF = 0b1111111111111111111111111111
decimalToPaddedHexString(-1,29) = 0x1FFFFFFF = 0b11111111111111111111111111111
decimalToPaddedHexString(-1,30) = 0x3FFFFFFF = 0b111111111111111111111111111111
decimalToPaddedHexString(-1,31) = 0x7FFFFFFF = 0b1111111111111111111111111111111
decimalToPaddedHexString(-1,32) = 0xFFFFFFFF = 0b11111111111111111111111111111111
Thrown: 'number above maximum value'
注意:不太清楚为什么它在 32 位以上失败
rgb(255, 255, 255) // 返回 FFFFFF
rgb(255, 255, 300) // 返回 FFFFFF
rgb(0,0,0) // 返回 000000
rgb(148, 0, 211) // 返回 9400D3 function rgb(...values){ return values.reduce((acc, cur) => { let val = cur >= 255 ? 'ff' : cur <= 0 ? '00' : Number(cur).toString(16); return acc + (val.length === 1 ? '0'+val : val); }, '').toUpperCase(); }
将十六进制颜色数字转换为十六进制颜色字符串:
toString
和 ES6 padStart
的简单解决方案,用于将十六进制颜色数字转换为十六进制颜色字符串。
const string = `#${color.toString(16).padStart(6, '0')}`;
例如:
0x000000
将变为 #000000
0xFFFFFF
将变为 #FFFFFF
Check this example in a fiddle here
任意精度
此解决方案采用输入十进制字符串,并返回十六进制字符串。支持小数部分。算法
将数字拆分为符号 (s)、整数部分 (i) 和小数部分 (f) 例如对于 -123.75,我们有 s=true, i=123, f=75
整数部分到十六进制:如果 i='0' 停止取模:m=i%16(任意精度)将 m 转换为十六进制数字并放入结果字符串以进行下一步计算整数部分 i=i/16(任意精度)
如果 i='0' 停止
取模:m=i%16(任意精度)
将 m 转换为十六进制数字并放入结果字符串
为下一步计算整数部分 i=i/16(任意精度)
小数部分计数小数位数 n 乘 k=f*16(以任意精度)将 k 拆分为 n 位的右侧部分并将它们放入 f,将其余部分与左侧部分放入 d 将 d 转换为十六进制并添加到结果。当结果小数位数足够时完成
计算小数位数 n
乘 k=f*16(任意精度)
将 k 拆分为 n 位的右侧部分并将它们放入 f 中,将其余部分拆分为左侧部分并将它们放入 d
将 d 转换为十六进制并添加到结果中。
当结果小数位数足够时完成
// @param decStr - 非负整数的字符串 // @param divisor - 正整数 function dec2HexArbitrary(decStr, fracDigits=0) { // 助手:将任意精度数除以 js 数 // @param decStr - 非负数的字符串- 负整数 // @param 除数 - 正整数 function arbDivision(decStr, divisor) { // 算法 https://www.geeksforgeeks.org/divide-large-number-represented-string/ let ans='';让 idx = 0;让 temp = +decStr[idx]; while (temp < 除数) temp = temp * 10 + +decStr[++idx]; while (decStr.length > idx) { ans += (temp / divisor)|0 ; temp = (temp % divisor) * 10 + +decStr[++idx];如果(ans.length == 0)返回“0”;返回答案; } // 助手:任意精度数的计算模块 // @param decStr - 具有非负整数的字符串 // @param mod - 正整数 function arbMod(decStr, mod) { // 算法 https://www.geeksforgeeks. org/how-to-compute-mod-of-a-big-number/让 res = 0; for (let i = 0; i < decStr.length; i++) res = (res * 10 + +decStr[i]) % mod;返回资源; } // 助手:将任意精度整数乘以 js 数字 // @param decStr - 非负整数的字符串 // @param mult - 正整数 function arbMultiply(decStr, mult) { let r='';让 m=0; for (let i = decStr.length-1; i >=0 ; i--) { let n = m+mult*(+decStr[i]); r= (i ? n%10 : n) + rm= n/10|0; } 返回 r; } // dec2hex 算法从这里开始 let h= '0123456789abcdef'; // 十六进制 'alphabet' let m= decStr.match(/-?(.*?)\.(.*)?/) || decStr.match(/-?(.*)/); // 单独的符号,整数,有理数 let i= m[1].replace(/^0+/,'').replace(/^$/,'0'); // 整数部分(无符号和前导零) let f= (m[2]||'0').replace(/0+$/,'').replace(/^$/,'0'); // 小数部分(最后没有零) let s= decStr[0]=='-'; // 符号 let r=''; // 结果 if(i=='0') r='0'; while(i!='0') { // 整数部分 r=h[arbMod(i,16)]+r; i=arbDivision(i,16); } if(fracDigits) r+=".";让 n = f.length; for(let j=0; j
问题基本上是期望有多少填充零。
如果您期望数字 1 和 17 中的字符串 01
和 11
。最好使用 Buffer 作为桥梁,将数字转换为字节,然后十六进制只是它的输出格式。并且字节组织由 Buffer 函数很好地控制,例如 writeUInt32BE、writeInt16LE 等。
import { Buffer } from 'buffer';
function toHex(n) { // 4byte
const buff = Buffer.alloc(4);
buff.writeInt32BE(n);
return buff.toString('hex');
}
> toHex(1)
'00000001'
> toHex(17)
'00000011'
> toHex(-1)
'ffffffff'
> toHex(-1212)
'fffffb44'
> toHex(1212)
'000004bc'
这是我的解决方案:
hex = function(number) {
return '0x' + Math.abs(number).toString(16);
}
问题是:“如何在 JavaScript 中将十进制转换为十六进制”。虽然问题没有指定十六进制字符串应以 0x 前缀开头,但任何编写代码的人都应该知道 0x 被添加到十六进制代码中,以区分十六进制代码与编程标识符和其他数字(1234 可以是十六进制、十进制或甚至八进制)。
因此,要正确回答这个问题,为了编写脚本,您必须添加 0x 前缀。
Math.abs(N) 函数将负数转换为正数,作为奖励,它看起来不像是有人通过木材削片机运行它。
我想要的答案应该有一个字段宽度说明符,因此我们可以例如显示 8/16/32/64 位值,就像您在十六进制编辑应用程序中看到它们一样。那是实际的正确答案。
Number('0xFF') === 255;
对于所有想要反向操作的人来说。
yourNumber
是一个变量。如果您想使用数字文字,则必须执行(45).toString(16)
之类的操作,但如果您要对数字进行硬编码,则只需自己将其写为十六进制字符串...(45).toString(16)
将始终等于 { 4},所以不要浪费cpu周期来解决这个问题。42..toString(16)
42
与42.0
相同。但是省略零并写42.
是合法的。因此,如果您编写42.toString(16)
,句点不会被视为您正在尝试调用函数,而是视为小数点。因此,要实际调用一个函数,您必须在小数点后添加一个额外的句点