2016-08-31 5 views
1

Diese Frage meiner früheren betrifft:Node.JS deserialisieren schwimmt auf unebenen Offset

Nodejs buffer bitwise slicing

I übertragen Daten über eine Bluetooth LE an einen node.js Server. Hier ist das Format der serialisierten Daten:

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

Daten werden als node.js Puffer empfangen. Ich bin in der Lage, oben und unten zu analysieren, da sie ganze Zahlen sind, und ich kann Shift-Operation für sie verwenden.

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

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

Allerdings sind für accX Schwimmer. Ich kann ReadFloat32LE nicht von node.js verwenden, da es nicht Byte-ausgerichtet ist. So, jetzt lese ich als uint32, verschiebe es zurück mit 9 niedrigstwertigen Ziffern. Wie bekomme ich float von seiner Bit-Darstellung in NodeJS?

+0

'23' Bits Herren' 0x7FFFFF'. Du hast ein "F" zu viele. – LPs

Antwort

2

Es ist keine schöne Lösung, aber Sie einen anderen Puffer eine solche Umwandlung vornehmen können:

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

Edit:

Es gibt eine andere Lösung, die auf modernen Browser-Umgebungen auch funktioniert:

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