我在 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
(推荐使用 Uint32Array
和 Float32Array
,因为它不继承平台的字节序。)
您还可以使用它来交换两个 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/