Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的64位十六进制到十进制_Javascript_Node.js_Floating Point - Fatal编程技术网

Javascript中的64位十六进制到十进制

Javascript中的64位十六进制到十进制,javascript,node.js,floating-point,Javascript,Node.js,Floating Point,需要在节点中将64位十六进制转换为十进制,最好没有第三方库 输入: Hex: 0x3fe2da2f8bdec5f4 Hex: 0x402A000000000000 输出 Dec: .589134 Dec: 13 对于那些试图在客户端脚本中这样做的人 // Split the array by bytes a = "3fe2da2f8bdec5f4" b = a.match(/.{2}/g); // Create byte array let buffer = new ArrayBuff

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

输入:

Hex: 0x3fe2da2f8bdec5f4
Hex: 0x402A000000000000
输出

Dec: .589134
Dec: 13

对于那些试图在客户端脚本中这样做的人

// 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));
//按字节分割数组
a=“3fe2da2f8bdec5f4”
b=a.match(/.{2}/g);
//创建字节数组
let buffer=new ArrayBuffer(8)
let bytes=新的Uint8Array(缓冲区)
//填充数组
for(设i=0;i<8;++i){
字节[i]=parseInt(b[i],16);
}
//转换和打印
let view=新数据视图(缓冲区)
log(view.getFloat64(0,false));

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


警告:偏移量
0
不是可选的。node.js API文档的几个版本显示了不为大多数缓冲区函数提供偏移量的示例,并将其视为偏移量
0
,但由于版本
9.4.0
9.5.0
9.6.0
9.6.1
,以及
9.7
,您将得到稍微不正确的结果(例如,
13.000001912238076
而不是确切的
13
)如果您没有在这些版本中指定对
readDoubleBE
的偏移量。

我想这回答了您的问题:谢谢Matt的链接,但这不起作用。DataView未定义,因为这是一个
node.js
问题。@UtkarshNarainSrivastava不在node.js中,没有。您将问题标记为
node.js
。更新了我的answer。如果有人正在寻找客户端解决方案,就把它放在这里:-)没问题,你的答案和我在上面的评论中链接的库在node.js中也可以使用。这一个非常干净@UtkarshNarainSrivastava注意到,我刚刚在几个节点版本中对此进行了测试。在10.4中,我得到了完全正确的结果,但在9.4.0中,我得到了一些奇怪的小错误。在某些版本中,这似乎是一个bug。例如,我在节点9.4.0中获得了
13.000001912238076
,用于
402000000000000
,尽管这表示
13
。@UtkarshNarainSrivastava我发现这是一个从版本9.4.0开始的错误:。它在
9.3
及更早版本中工作,但在
9.4.0
9.5.0
9.6.0
9.6.1
9.7
中存在该漏洞。它在
9.8
及更高版本中被修复。如果您将此用于个人用途,而不使用这些版本,则可以使用此版本,但如果您正在制作npm包或需要与各种节点版本兼容的东西,则不应使用此版本。哦,好消息,有一个非常简单的修复方法可以使其在所有版本的节点中工作。我将编辑我的答案。@UtkarshNarainSrivastava更新了所有版本的修复程序。只需确保将偏移量
0
指定为readDoubleBE的参数,即可在所有版本中使用。
const hex = '3fe2da2f8bdec5f4';
const result = Buffer.from( hex, 'hex' ).readDoubleBE( 0 );
console.log( result );