【问题标题】:64bit Hex to Decimal in JavascriptJavascript中的64位十六进制到十进制
【发布时间】:2018-06-11 17:14:48
【问题描述】:

需要在节点中将 64 位十六进制转换为十进制,最好没有 3rd 方库。

输入:

Hex: 0x3fe2da2f8bdec5f4
Hex: 0x402A000000000000

输出

Dec: .589134
Dec: 13

【问题讨论】:

标签: javascript node.js floating-point


【解决方案1】:

您可以在 node.js 中使用Buffer 轻松完成此操作,无需任何库:

const hex = '3fe2da2f8bdec5f4';
const result = Buffer.from( hex, 'hex' ).readDoubleBE( 0 );
console.log( result );

警告:0 的偏移量不是可选的。 node.js API 文档的几个版本显示了不为大多数 Buffer 函数提供偏移量的示例,它被视为0 的偏移量,但由于bug in node.js 版本9.4.09.5.0、@987654329 @、9.6.19.7 如果在这些版本中未指定到 readDoubleBE 的偏移量,您将得到稍微不正确的结果(例如,13.000001912238076 而不是完全正确的 13)。

【讨论】:

  • 这个真的很干净!
  • @UtkarshNarainSrivastava 请注意,我刚刚在几个节点版本中对此进行了测试。在 10.4 中我得到了完全正确的结果,但在 9.4.0 中我得到了一些奇怪的小错误。这似乎是某些版本中的错误。例如。我在节点 9.4.0 中为 402A000000000000 得到了 13.000001912238076,即使这正好代表 13
  • @UtkarshNarainSrivastava 我发现这是一个从 9.4.0 版本开始的错误:github.com/nodejs/node/issues/18208。它适用于9.3 和更早版本,但该错误存在于9.4.09.5.09.6.09.6.19.7。它已在 9.8 及更高版本中修复。如果您将其用于个人用途而不使用那些版本,您可以使用它,但如果您正在制作 npm 包或需要与各种节点版本兼容的东西,则不应使用它。
  • 哦,好消息,有一个非常简单的修复方法可以让它在所有版本的节点中工作。我将编辑我的答案。
  • @UtkarshNarainSrivastava 更新了所有版本的修复程序。只需确保将偏移量 0 指定为 readDoubleBE 的参数,它将适用于所有版本。
【解决方案2】:

对于那些试图在客户端 javscript 中执行此操作的人

// Split the array by bytes 
a = "3fe2da2f8bdec5f4"
b = a.match(/.{2}/g);

// Create byte array 
let buffer = new ArrayBuffer(8)
let bytes = new Uint8Array(buffer)

// Populate array 
for(let i = 0; i < 8; ++i) {
    bytes[i] = parseInt(b[i], 16);
}

// Convert and print 
let view = new DataView(buffer)
console.log(view.getFloat64(0, false));

【讨论】:

  • DataView 未定义,因为这是一个node.js 问题。
  • @UtkarshNarainSrivastava 在没有library 的情况下不在node.js 中。您将您的问题标记为node.js
  • 更新了我的答案。将其留在这里以防万一有人正在寻找客户端解决方案:-)
  • 没问题,您的答案与我在上面评论中链接的库相结合也适用于 node.js。