2017-02-23 32 views
-1

私はこれに新しいので、基本的な質問をしているかもしれません。 私は、バイナリファイルに格納する山車ノードjs、バイナリファイルに整数を書き込む/読み込む方法は?

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

の配列を持っています。 は、私は私が後でそのファイルをロードするとき、私は第一の長さ10を読むこと、そして読ませ

10 1.3 2.0 10 9.8, ... 

は10回浮かぶ次の形式で書きたいです。

私はスペースを節約し、単なるテキストとしての書き込み/読み込みよりも速くなければならないと思います。

これまでのところ、node.jsにバイナリファイルに関するビット情報が見つかりました。

私はバッファにファイルを書き込んでバッファに書き込むことができませんでした。

また、nodeのbufferには整数0〜255しかないと書かれているので、255より大きい整数は扱えないと書かれています。例えば

、どのように私は、バイナリファイルから配列

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

への読み取り/書き込み/ことができます。

私は少しガイダンスが必要だと思うので、ここで私は助けを求めています。 私は何をすべきか教えてください、ありがとう!

答えて

1

Buffer(または標準のUint8Arrayを使用する必要がありますが、これはnode.jsなのでBufferを使用します)。基本的には、ドキュメントを読むことで何をする必要があるのか​​を理解することができますが、頭を据えるために必要なことを説明します。

まず、いくつかの決定を下す必要があります。

  1. 整数を8ビットまたは16ビットまたは32ビットまたは48ビットにしますか? (そう、ノードは48ビットのintをサポートしますが、64ではなく - おそらくjsの数字は52ビットの仮数で倍数になるので、64ビットintは正確に数値に変換できません)。また、浮動小数点数を浮動小数点数(32ビット)または倍精度(64ビット)にしたいのですか?

  2. 数字をビッグエンディアンまたはリトルエンディアンとしてディスクに保存しますか? FWIWでは、プログラマはリトルエンディアンを好む傾向があり、ハードウェア設計者はビッグエンディアンを好む傾向があります。本当に重要ではありませんがは一貫していますです。エンディアンを1つのファイルに混ぜてはいけません。

ここでは例を挙げましょう。たとえば、2つの32ビットのintと1つのdoubleをファイルに格納したいとします。必要なスペースは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 

今、あなたはfsの書き込み関数のいずれかを使用してファイルにバッファbの値を書き込むことができます。 fs関数のデフォルトのエンコーディングはutf8なので、データを解析して破損させる可能性があるため、エンコードを"binary"に設定する必要があります。

ファイルから値を読み取るには、同じことを逆にします。 buffer.read...機能を使用してください。再度、ディスクからファイルを読み込むときには、符号化を"binary"に設定してください(または、それは "バッファ"ですか?)。

+0

上記の簡単な例では、文字列形式(15文字の間にスペースを追加する場合は17文字)で15バイトを取り、16バイトのバイナリ値として格納する3つの数字をエンコードしています。バイナリは、デバッグするのが難しいという犠牲を払って、多くのことを得ることはありません – slebetman

関連する問題