Node.JS 反序列化偏移量不均匀的浮点数

Node.JS deserialize floats at uneven offset

这个问题和我之前的问题有关:

Nodejs buffer bitwise slicing

我通过蓝牙 LE 将数据传输到 node.js 服务器。这是序列化数据的格式:

top: 10 bit (unsigned integer)
bottom: 10 bit (unsigned integer)
accelerometerX: 23 bit (truncated 32-bit floating point)
accelerometerY: 23 bit
...

数据作为 node.js 缓冲区接收。我能够解析 top 和 bottom,因为它们是整数,我可以对它们使用移位操作。

top = data.readUInt16LE() & 0x3FF;
bottom = data.readUInt16LE(1);
bottom = (bottom >> 2) & 0x3FF;

accX = data.readUInt32LE(2);
accX = ((accX >> 4) & 0x7FFFFFF) << 9;

但是,accX 是浮点数。我不能使用 node.js 中的 ReadFloat32LE,因为它不是字节对齐的。所以现在我正在读取 uint32,将它移回 9 个最低有效数字。我如何从 NodeJS 中的位表示中获取浮点数?

这不是一个很好的解决方案,但您可以使用另一个缓冲区来进行此类转换:

function intToFloat(integer) {
    let buf = Buffer.alloc(4);
    buf.writeUInt32LE(integer);
    return buf.readFloatLE();
}

编辑:

还有另一种解决方案,也适用于现代浏览器环境:

function intToFloat(integer) {
    let intArray = new Uint32Array([ integer ]);
    let floatArray = new Float32Array(intArray.buffer);
    return floatArray[0];
}