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

标签 javascript parsing floating-point hex ieee-754

我在 Stackoverflow 上研究了几天,试图解决这个问题,并在 JsFiddle 中玩了一段时间,但到目前为止还没有成功。

这是我的问题:我收到一个包含多个值的 Base64 编码字符串。无符号整数和 float 。将 Base64 解码为十六进制字符串一切顺利。无符号整数也是如此。问题在于解码 float 。

b76a40e9000000350a3d422d00000059e37c409a0000002f90003b6e00000000

这是我的数据,作为示例,我们将使用前 32 位,它是字节顺序 1-0-3-2 的 IEE-754 float 。 所以这就是 0xb76a40e9,我知道它是 7.30363941192626953125,当我们将它交换为 3-2-0-1 时,它就变成了 0x40e9b76a。当我把这个十六进制字符串放入https://www.h-schmidt.net/FloatConverter/IEEE754.html时这已得到证实。

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

任何输入都将不胜感激,迄今为止人们制作的所有代码示例都会导致与我预期不同的数字。

最佳答案

使用 DataView 从单词中解压 float :

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

关于JavaScript 十六进制字符串到 IEEE-754 浮点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49221045/

相关文章:

java - 以GB为单位分割一个巨大的XML,保留页眉和页脚 - 相同的结构

python - 在python中解析字符串

我可以用 popen() 解析 ngrep 的输出吗?

objective-c - iOS 圆形 float

c - `nextafter` 和 `nexttoward` : why this particular interface?

javascript - 在鼠标进入时停止滑动滑动自动播放并在鼠标离开时开始自动播放

javascript - 在我的 cordova 应用程序上使用 webrtc 代码

javascript - 为什么下面的代码 `p.__proto__.aa`不等于200?

javascript - 使用 Assets.getText 遍历目录

c++ - 在 float 不好的样式上使用增量(运算符++)吗?