将具有IEEE-754双精度十六进制表示的字符串转换为JavaScript数字变量

Nos*_*dna 8 javascript double hex ieee-754

假设我有一个十六进制数"4072508200000000",我希望将IEEE-754双格式中表示的浮点数(293.03173828125000)放入JavaScript变量中.

我可以想到一种使用一些屏蔽和调用pow()的方法,但是有一个更简单的解决方案吗?

需要客户端解决方案.

这可能有所帮助.这是一个允许您输入IEEE-754的十六进制编码并获得尾数和指数分析的网站.

http://babbage.cs.qc.edu/IEEE-754/64bit.html

因为人们总是倾向于问"为什么?",这就是为什么:我正在尝试填写Google的Procol Buffers(protobuf)现有但不完整的实现.

Dig*_*oss 10

我不知道一个好方法.它当然可以通过艰难的方式完成,这是一个完全在JavaScript中的单精度示例:

js> a = 0x41973333
1100428083
js> (a & 0x7fffff | 0x800000) * 1.0 / Math.pow(2,23) * Math.pow(2,  ((a>>23 & 0xff) - 127))
18.899999618530273
Run Code Online (Sandbox Code Playgroud)

生产实现应该考虑到大多数字段都具有魔术值,通常通过为最大或最小的内容指定特殊解释来实现.因此,检测NaNs和无穷大.上面的例子应该检查底片.(a&0x80000000)

更新:好的,我也是双倍的.你不能直接扩展上面的技术,因为内部JS表示是一个double,因此根据它的定义,它最多可以处理长度为52的位串,并且它根本不能移动超过32.

好的,要做到双倍,你首先要把字符串切断低8位或32位; 用一个单独的对象处理它们.然后:

js> a = 0x40725082      
1081233538
js> (a & 0xfffff | 0x100000) * 1.0 / Math.pow(2, 52 - 32) * Math.pow(2, ((a >> 52 - 32 & 0x7ff) - 1023))
293.03173828125
js> 
Run Code Online (Sandbox Code Playgroud)

我保留了上面的例子,因为它来自OP.更难的情况是低32位有一个值.这是0x40725082deadbeef的转换,一个全精度双:

js> a = 0x40725082
1081233538
js> b = 0xdeadbeef
3735928559
js> e = (a >> 52 - 32 & 0x7ff) - 1023
8
js> (a & 0xfffff | 0x100000) * 1.0 / Math.pow(2,52-32) * Math.pow(2, e) +          
     b * 1.0 / Math.pow(2, 52) * Math.pow(2, e)
293.0319506442019
js> 
Run Code Online (Sandbox Code Playgroud)

有一些明显的子表达式可以分解,但我已经这样离开了,所以你可以看到它与格式的关系.