2016-08-31 66 views
1

這個問題涉及到我以前的:Node.js的反序列化的不均勻花車偏移

Nodejs buffer bitwise slicing

我發送通過藍牙LE數據到服務器的nod​​e.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 = 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中的位表示獲得浮點數?

+0

'23位男士'0x7FFFFF'。你有一個'F'太多了。 – LPs

回答

2

這不是一個漂亮的解決方案,但你可以用另一種緩衝做出這樣的轉換:

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]; 
}