2016-02-29 83 views
0

目前,當二進制文件中包含64位浮點,我做的:閱讀包含JavaScript的32位浮點二進制文件

fs.open('doubles.bin', 'r', (err, fd) => { 
    if (err) reject(err); 
    const buf = new Buffer(size); 
    fs.read(fd, buf, 0, size, start, (err2) => { 
    if (err2) reject(err2); 
    const f32 = new Float32Array(buf.buffer); 
    const data = Array.prototype.slice.call(f32); 
    resolve({ id, data }); 
    }); 
}); 

(二進制是一個數字的簡單列表,他們沒有被分開任何東西)

我想這樣的作品,因爲Float32Array視圖預計讀取標準的JavaScript Number S,其大小爲64位。

只要二元包含32位的數字,我只能得到垃圾出它(NaN S和錯誤的號碼)。

我怎麼能讀一個二進制文件,其中包含32位浮點數,JavaScript和它轉換成數組?

+0

「我想這樣的作品,因爲Float32Array視圖預計讀取標準的JavaScript數字,其大小爲64位。」不,TypedArrays不會那樣工作。如果我的答案不起作用,請提供示例數據。它是如何產生的?也許這種排序是錯誤的。 – Prinzhorn

+0

你的答案看起來正確,但我不能得到任何meaningfull出來的文件。這裏是一個示例:https://dl.dropboxusercontent.com/u/8538734/doubles.bin – v2blz

+0

你確定.bin文件是32位浮點數嗎?你期望什麼樣的數字?喜歡哪個範圍?看到我更新的答案。 – Prinzhorn

回答

1

使用 DataView類的 getFloat32方法。根據數據的存儲方式,您還需要標記 littleEndian

有節點的緩存和TypedArrays之間slight incompatibilities。唯一安全的方法是手動將Buffer中的每個字節複製到ArrayBuffer。或者在你的情況下,根本不要使用TypedArrays並使用節點方法。

這將輸出第二個和第三個雙字節(64位)的大端(我們跳過8個字節並從文件中讀取下16個字節)。

var fs = require('fs'); 

var position = 8; 
var length = 16; 

fs.open('./doubles.bin', 'r', function(err, fd) { 
    if(err) { 
     return console.error(err); 
    } 

    var buffer = new Buffer(length); 

    fs.read(fd, buffer, 0, length, position, function(err, bytesRead) { 
     if(err) { 
      return console.error(err); 
     } 

     console.log(buffer.readDoubleBE(0)); 
     console.log(buffer.readDoubleBE(8)); 
    }); 
}); 

0.37290650606155396 
0.4405119717121124 
+0

你的答案有效!但你能提供一個你可以從偏移量中讀取的地方嗎?就像你可以用fs.read一樣? – v2blz

+0

@ v2blz已更新。 – Prinzhorn

+0

謝謝!有用。 – v2blz