繁体   English   中英

字节读取的浮点值完全错误 - Node.js

[英]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是一个Bufferthis.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM