将 IEEE 754 从位流转换为 JavaScript 中的浮点数
Converting IEEE 754 from bit stream into float in JavaScript
我已经使用 GO 语言函数 (math.Float32bits) 序列化了 32 位浮点数,其中 returns 浮点数对应于 IEEE 754 二进制表示。然后将该数字序列化为 32 位整数,并作为字节数组读入 java 脚本。
例如,这里是实际数字:
float: 2.8088086
as byte array: 40 33 c3 85
as hex: 0x4033c385
有一个 demo converter 显示相同的数字。
我需要从 JavaScript 中的字节数组中取回相同的浮点数,但我不知道该怎么做。
根据您描述的数据:
var buffer = new ArrayBuffer(4);
var bytes = new Uint8Array(buffer);
bytes[0] = 0x40;
bytes[1] = 0x33;
bytes[2] = 0xc3;
bytes[3] = 0x85;
我们可以使用 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));
2.8088085651397705
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));
有点不同的解决方案,如果您不能使用 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);
我的回答和@Jeremys 的回答一样,除了一些小改动。请现在使用 const
/let
和 Float32Array
/Float64Array
而不是 DataView
。我是这样解决的:
// 0x40a00000 is "5" in float/IEEE-754 32bit.
// You can check this here: https://www.h-schmidt.net/FloatConverter/IEEE754.html
// MSB (Most significant byte) is at highest index
const bytes = [0x00, 0x00, 0xa0, 0x40];
// The buffer is like a raw view into memory.
const buffer = new ArrayBuffer(bytes.length);
// The Uint8Array uses the buffer as its memory.
// This way we can store data byte by byte
const byteArray = new Uint8Array(buffer);
for (let i = 0; i < bytes.length; i++) {
byteArray[i] = bytes[i];
}
// float array uses the same buffer as memory location
const floatArray = new Float32Array(buffer);
// floatValue is a "number", because a number in javascript is a
// double (IEEE-754 @ 64bit) => it can hold f32 values
const floatValue = floatArray[0];
// prints out "5"
console.log(`${JSON.stringify(bytes)} as f32 is ${floatValue}`);
// double / f64
// const doubleArray = new Float64Array(buffer);
// const doubleValue = doubleArray[0];
我已经使用 GO 语言函数 (math.Float32bits) 序列化了 32 位浮点数,其中 returns 浮点数对应于 IEEE 754 二进制表示。然后将该数字序列化为 32 位整数,并作为字节数组读入 java 脚本。
例如,这里是实际数字:
float: 2.8088086
as byte array: 40 33 c3 85
as hex: 0x4033c385
有一个 demo converter 显示相同的数字。
我需要从 JavaScript 中的字节数组中取回相同的浮点数,但我不知道该怎么做。
根据您描述的数据:
var buffer = new ArrayBuffer(4);
var bytes = new Uint8Array(buffer);
bytes[0] = 0x40;
bytes[1] = 0x33;
bytes[2] = 0xc3;
bytes[3] = 0x85;
我们可以使用 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));
2.8088085651397705
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));
有点不同的解决方案,如果您不能使用 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);
我的回答和@Jeremys 的回答一样,除了一些小改动。请现在使用 const
/let
和 Float32Array
/Float64Array
而不是 DataView
。我是这样解决的:
// 0x40a00000 is "5" in float/IEEE-754 32bit.
// You can check this here: https://www.h-schmidt.net/FloatConverter/IEEE754.html
// MSB (Most significant byte) is at highest index
const bytes = [0x00, 0x00, 0xa0, 0x40];
// The buffer is like a raw view into memory.
const buffer = new ArrayBuffer(bytes.length);
// The Uint8Array uses the buffer as its memory.
// This way we can store data byte by byte
const byteArray = new Uint8Array(buffer);
for (let i = 0; i < bytes.length; i++) {
byteArray[i] = bytes[i];
}
// float array uses the same buffer as memory location
const floatArray = new Float32Array(buffer);
// floatValue is a "number", because a number in javascript is a
// double (IEEE-754 @ 64bit) => it can hold f32 values
const floatValue = floatArray[0];
// prints out "5"
console.log(`${JSON.stringify(bytes)} as f32 is ${floatValue}`);
// double / f64
// const doubleArray = new Float64Array(buffer);
// const doubleValue = doubleArray[0];