2017-02-23 173 views
-1

我對此很陌生,所以可能會提出一個基本問題。 我有花車node js,如何將二進制文件寫入/讀取整數?

[1.3, 2.0, 10, 9.8, ... ] . //let's say length = 10 

,我想在一個二進制文件來存儲陣列。 我想以下列格式

10 1.3 2.0 10 9.8, ... 

,使得當我後來加載該文件,我首先讀取的長度10,則讀漂浮10次寫。

我認爲這樣可以節省空間,而且應該比以文本形式書寫/閱讀更快。

到目前爲止,我在node.js中找到了關於二進制文件的一些信息。

var fs = require('fs'); 
    var wstream = fs.createWriteStream('myBinaryFile'); 
    var buffer = crypto.randomBytes(100); 
    wstream.write(buffer); 
    wstream.end(); 

在那裏我不知道如何寫入我的號碼到緩衝區並寫入緩衝區文件。

此外,我讀了一些文件,說節點中的緩衝區只有整數0〜255,這是否意味着它不能處理大於255的整數?

例如,如何可以寫/從一個二進制文件中讀取的陣列

[11000, 24535, 92833, 45353, ... ] 

到/。

我想我需要一點指導,所以我在這裏尋求幫助。 請指出我應該做什麼,謝謝!

回答

1

你需要使用Buffer(或標準的Uint8Array,但因爲這是node.js我會使用緩衝區)。基本上你可以通過閱讀文檔來弄清楚你需要做什麼,但是我會描述你需要做什麼來給你一個良好的開端。

首先,您需要做出幾個決定。

  1. 你想要你的整數是8位或16位或32位或48位? (是的,節點支持48位整數,但不支持64位 - 可能是因爲js中的數字是52位尾數的雙倍,所以64位整數不能準確地轉換爲數字)。另外,如果你想要浮點數,你想浮點數(32位)還是雙精度(64位)?

  2. 你想將數字存儲在磁盤上作爲大端還是小端? FWIW,程序員傾向於喜歡小端,而硬件設計者傾向於喜歡大端。真的不重要,但是一致的。不要在一個文件中混合排序。

現在你已經決定了讓我們來做一個例子。舉個例子,你想在一個文件中存儲兩個32位整數和一個雙精度值。你需要的空間是32 + 32 + 64 = 128 bits = 16 bytes。所以你需要一個16字節的緩衝區(沒錯,緩衝區字節級操作,你基本上暫時晉升爲C程序員):

var b = Buffer.alloc(16); 

現在,讓我們保存這些數字。比方說,你已經決定將它們存儲爲小尾數:

var x = 12345; 
var y = 54321; 
var z = 1.234; 

b.writeInt32LE(x,0); // write x to bytes 0-3 
b.writeInt32LE(y,4); // write y to bytes 4-7 
b.writeDoubleLE(z,8); // write z to end of buffer 

現在你可以寫緩衝區b的價值使用任何FS寫入功能的文件。請注意,您應該將編碼設置爲"binary",因爲fs函數的默認編碼是utf8,可能會嘗試解析您的數據並將其破壞。

要從文件中讀取值,您可以按相反方式進行操作。使用buffer.read...函數。同樣,當從磁盤讀取文件時,一定要將編碼設置爲"binary"(或者它是「緩衝區」?)。

+0

應該注意的是,在上面的簡單示例中,我們編碼了3個數字,它們以字符串形式佔據15個字節(如果您想在它們之間添加空格,則爲17個),並將它們存儲爲16個字節的二進制值。 Binary並不總是以犧牲更難調試爲代價 – slebetman

相關問題