JavaScript十六进制字符串到IEEE-754浮点

时间:2018-03-11 14:24:22

标签: javascript parsing floating-point hex ieee-754

我已经在Stackoverflow周围寻找了几天试图解决这个问题并在JsFiddle玩了一段时间但到目前为止没有运气。

这是我的问题:我收到一个base64编码的字符串,其中包含多个值。无符号整数和浮点数。将base64解码为十六进制字符串就可以了。无符号整数也是如此。问题在于解码浮动。

b76a40e9000000350a3d422d00000059e37c409a0000002f90003b6e00000000

这是我的数据,作为一个例子,使用前32位,是一个字节顺序为1-0-3-2的IEE-754浮点数。 我知道的0xb76a40e97.30363941192626953125,当我们将其换成3-2-0-1时,它就变成了0x40e9b76a。当我将此十六进制字符串放入已确认的https://www.h-schmidt.net/FloatConverter/IEEE754.html时。

我的问题是,如果在javascript中有一个将十六进制IEEE-754浮点字符串转换为javascript浮点字符串的实现,那么我很长时间搜索这个问题。 JS'自己的parseInt会接受hex,但是parseFloat由于某种原因没有?

任何人都会非常感激,因此人们所制作的所有代码示例都会产生与我期待的数字不同的数字。

1 个答案:

答案 0 :(得分:4)

使用DataView从单词解包浮动:

> v = new DataView(new ArrayBuffer(4))
> v.setUint32(0, 0x40e9b76a)
> v.getFloat32(0)
7.3036394119262695

(建议使用Uint32ArrayFloat32Array,因为它不会继承平台的字节顺序。)

您也可以使用它来交换两个16位单元:

> v.setUint32(0, 0xb76a40e9)
> ((hi, lo) => {
    v.setUint16(0, hi);
    v.setUint16(2, lo);
  })(v.getUint16(2), v.getUint16(0))
> v.getUint32(0).toString(16)
'40e9b76a'