如何在JS中将字符串类型的十六进制转换为数字?

32
假设我有一个十六进制数,例如"0xdc",在JS中如何将此十六进制string转换为十六进制Number类型?
只需去掉引号即可。使用Number()构造函数和parseInt()函数只会将其转换为介于0和255之间的整数,我只需要0xdc
编辑: 为了更加清晰地表达我的观点: 我想从"0xdc"(类型为String)到0xdc(类型为Number)。

这个问题是“错误”的,因为混淆了两个不同的东西:一个是值,另一个是表示。计算机将该值以二进制形式存储为11011100-您可以通过运行parseInt("0xDC", 16).toString(2)来检查。在十六进制、十进制或任何进制中表示它只是一种表示方式。 - isapir
3个回答

48

您可以使用Number函数,根据特定格式将字符串解析为数字。

console.log(Number("0xdc"));

JavaScript使用以下方式来识别数字格式:

  1. 0x = 十六进制
  2. 0b = 二进制
  3. 0o = 八进制

1
不,那仍然返回一个确切的数字,220。我想要字面上的字节,所以我想要的是0xdc,而不是“0xdc”。 - Fabian Tjoe A On
你想用 0xdc 这个 Number 类型做什么?如果你像这样分配任何变量 var v = 0xdc,并尝试执行 console.log(v),它将会输出 220 而不是 0xdc - dhaker
1
我想将它发送为动态值到通过UDP发送的缓冲区中,例如:Buffer.from([0x00, 0x0E, dynamicStringValue, 0xef])为了使我的缓冲区正常工作,dynamicStringValue 应该是一个数字而不是一个字符串,对吗? - Fabian Tjoe A On
看到上面的答案,你是对的。我可以将你的代码产生的整数直接发送到我的缓冲区。谢谢。 - Fabian Tjoe A On
3
这里的parseInt()是多余的。Number()已经返回了一个数字类型(在内部仅以1和0存储,没有原始字符串是二进制/八进制/十进制/十六进制的概念)。这里所有parseInt()做的就是将Number("0xdc")的结果转化回一个(十进制/基数-10)字符串,然后再将其转换为相同的数字。 - Ivar

7

如果你想将字符串转换为十六进制表示,你可以使用基数为16的数字进行转换。

parseInt("0xdc", 16)  // gives you 0xdc

4

简而言之:

@dhaker的答案parseInt(Number("0xdc"), 10)是正确的。

内存中的数字表示

在JavaScript中,数字0xdc220以相同的方式表示。

因此,0xdc == 220将返回true。前缀0x用于告诉JavaScript这个数字是十六进制的。

因此,无论您何时传递220,都可以安全地传递0xdc,反之亦然

字符串格式

除非另有说明,否则数字始终以十进制显示。

如果要将其作为字符串打印出来,则'0x' + Number(220).toString(16)会给出'0xdc'


简而言之

parseInt('0x' + Number(220).toString(16),16) => 220


啊,我明白了,我误解了。我可以使用十进制表示法。谢谢。 - Fabian Tjoe A On

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接