[英]Floating-point value from bytes reading completely wrong - Node.js
我正在尝试从缓冲区中读取 32 位 IEEE-754 浮点数,但它根本无法正确读取。 例如, [00 00 00 3f]
变为8.828180325246348e-44
而不是 0.5。 我还注意到负浮点数永远不会正确转换。 例如, [00 00 20 c1]
变为1.174988762336359e-41
,而不是 -10.0。 我究竟做错了什么? 这是一些浮点精度问题吗? 这是我的代码:
function readFloat() {
const value = this.data.readFloatBE(this.offset);
this.offset += 4;
return value;
}
this.data
是一个Buffer
, this.offset
是当前读取的偏移量,以字节为单位。
需要注意的一点是,即使在 vanilla JavaScript 中使用这样的东西,我也会得到相同的结果:
function floatFromBytes(bytes) {
buf = new ArrayBuffer(4);
v = new DataView(buf);
bytes.forEach((b, i) => {
v.setUint8(i, b);
})
return v.getFloat32(0);
}
floatFromBytes([0x00, 0x00, 0x20, 0xc1]); // should be -0.5, but is 1.174988762336359e-41
编辑:已解决,结果字节由于某种原因被颠倒了。 新代码:
function readFloat() {
// This is a bit of a weird IEEE 754 float implementation, but it works
let buf = new ArrayBuffer(4);
let view = new DataView(buf);
let bytes = this.readBytes(4);
// reverse the bytes
for (let i = 0; i < 4; i++) {
view.setUint8(i, bytes[3 - i]);
}
return view.getFloat32(0);
}
正如您所指出的,这只是一个字节序问题。 不同的系统期望字节以不同的方式排序,目前最常见的排序是小端(Intel x86兼容处理器使用,ARM系统通常设置为使用这种模式)。
因为 JavaScript 试图与 CPU 无关,它要求您选择要解释事物的顺序。 Buffer.readFloatBE
中的BE
代表 big-endian,还有一个LE
版本,您可能想要使用它。
例如:
Buffer.from('0000003f','hex').readFloatLE() // => 0.5
Buffer.from('000020c1','hex').readFloatLE() // => -10.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.