在JavaScript中将IEEE 754从位流转换为浮点数

Ser*_*i G 3 javascript floating-point ieee-754

我使用GO语言函数(math.Float32bits)序列化了32位浮点数,它返回对应于IEEE 754二进制表示的浮点数.然后将此数字序列化为32位整数,并将其作为字节数组读入java脚本.

例如,这是实际数字:

float: 2.8088086
as byte array:  40 33 c3 85
as hex: 0x4033c385
Run Code Online (Sandbox Code Playgroud)

有一个演示转换器显示相同的数字.

我需要从JavaScript中的字节数组中获取相同的浮点数,我不知道如何做到这一点.

小智 7

根据您描述的数据:

var buffer = new ArrayBuffer(4);
var bytes = new Uint8Array(buffer);
bytes[0] = 0x40;
bytes[1] = 0x33;
bytes[2] = 0xc3;
bytes[3] = 0x85;    
Run Code Online (Sandbox Code Playgroud)

我们可以使用以下代码将值检索为浮点数DataView:

var view = new DataView(buffer);
// If you only had a Uint8Array, you would use bytes.buffer instead of buffer.

console.log(view.getFloat32(0, false));
Run Code Online (Sandbox Code Playgroud)
2.8088085651397705
Run Code Online (Sandbox Code Playgroud)

var buffer = new ArrayBuffer(4);
var bytes = new Uint8Array(buffer);
bytes[0] = 0x40;
bytes[1] = 0x33;
bytes[2] = 0xc3;
bytes[3] = 0x85;    

var view = new DataView(buffer);

console.log(view.getFloat32(0, false));
Run Code Online (Sandbox Code Playgroud)


Iły*_*sov 5

有点不同的解决方案,如果你不能使用 DataView:

var bytes = [ 0x40, 0x33, 0xc3, 0x85 ];
var bits = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | (bytes[3]);
var sign = ((bits >>> 31) == 0) ? 1.0 : -1.0;
var e = ((bits >>> 23) & 0xff);
var m = (e == 0) ? (bits & 0x7fffff) << 1 : (bits & 0x7fffff) | 0x800000;
var f = sign * m * Math.pow(2, e - 150);

document.write(f);
Run Code Online (Sandbox Code Playgroud)

  • 只是为了让未来的读者想知道为什么大多数实现在 `m * Math.pow(2, e - 127)` 中使用 `127`:上面,`m * Math.pow(2, e - 150)` 等于 `m * Math。 pow(2, -23) * Math.pow(2, e - 127)` 并且是添加第 24 个 [尾数中的隐式前导位](http://steve.hollasch.net/cgindex/coding) 的不错优化/ieeefloat.html)。 (3认同)