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

JavaScript Hexadecimal string to IEEE-754 Floating Point

我已经在 Whosebug 上看了几天,试图解决这个问题,并在 JsFiddle 中玩了一段时间,但到目前为止运气不好。

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

b76a40e9000000350a3d422d00000059e37c409a0000002f90003b6e00000000

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

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

任何输入将不胜感激,到目前为止,人们编写的所有代码示例的结果都与我预期的不同。

使用 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'