Node.js のバッファーについて
バッファは、生メモリ内の特定の場所です。これは、処理ユニットがその特定の瞬間に受け入れることができない余分なバイナリ データの一時的なストレージ スペースとして機能します。
Node.js には Buffer クラスが含まれています。TCP (Transfer Control Protocol) ストリームとファイル システムでの読み取り/書き込み操作を管理するときに、バイナリ データを処理できます。
バッファの内容を作成、読み取り、変更する方法を学びます。
バッファの作成
Node.js で Buffer を作成するには、 alloc()またはfrom()メソッドを使用します。alloc ()メソッドは新しいバッファーを作成し、作成時にそのサイズを最初で唯一の必須パラメーターとして指定します。バッファ作成時に格納するデータがない場合に便利です。
alloc()メソッドでバッファを作成するときに、バッファ サイズ パラメータをバイト単位で指定します。例えば:
const buf = Buffer.alloc(8);
console.log(buf);
// output: <Buffer 00 00 00 00 00 00 00 00>
alloc()メソッドを使用してデータを作成すると、Buffer クラスは新しいデータのプレースホルダー値としてゼロを自動的に追加します。
Buffer クラスは、16 進形式を使用して、各 0 値を00として表現します。この例では、合計 8 つの値が含まれています。
異なるプレースホルダー値で Buffer を初期化するには、2 番目のfillパラメーターを渡します。
const buf_filled = Buffer.alloc(8, 5);
console.log(buf_filled);
// output: <Buffer 05 05 05 05 05 05 05 05>
このオブジェクトは、値05の 8 バイトを格納するメモリーの一部を引用します。fillパラメーターとして数値を渡しましたが、バッファーはデータをバイナリでしか保存しないことに注意してください。
バッファにメモリを割り当てた後、write()メソッドを呼び出してデータを書き込みます。
const buf = Buffer.alloc(8);
buf.write("v", "utf-8");
console.log(buf)
// output: <Buffer 76 00 00 00 00 00 00 00>
buf.write("va","utf-8");
console.log(buf)
// output: <Buffer 76 61 00 00 00 00 00 00>
write ()メソッドは、文字エンコーディングを使用して、 utf-8を使用して最初のパラメーターを変換し、文字列をバッファーに書き込みます。文字列に 2 番目の文字を追加すると、2 番目のバイトがいっぱいになります。
文字列や配列などの既存のデータ型からデータを抽出するには、from()メソッドを使用します。このメソッドは、文字列と配列からバッファを作成します。
例えば:
// String
const stringBuf = Buffer.from('string')
console.log(stringBuf)
// output: <Buffer 73 74 72 69 6e 67>
// Array
const arrayBuf = Buffer.from([97, 114, 114, 97, 121], 'hex')
console.log(arrayBuf);
// output: <Buffer 61 72 72 61 79>
from ()メソッドは、入力を最初のパラメーターとして受け取り、データをエンコードするために必要なバイト数を計算し、結果をバッファーに送信します。別のエンコード形式を 2 番目のパラメーターとして指定することで、既定のエンコード (UTF-8) をオーバーライドできます。
from()メソッドに数値を渡すと、エラーが発生します。
バッファの読み取り
バッファは配列に似ていますが、サイズを変更することはできず、組み込みメソッドのおかげでバイナリ コンピュータ データを処理できます。
Buffer クラスを使用すると、JavaScript の角括弧構文を使用してデータの個々のバイトを読み取ることができます。
例えば:
const myBuf = Buffer.from('Mine');
console.log(MyBuf[1]);
// output: 105
console.log(MyBuf[3]);
// output: 101
console.log(MyBuf[5]);
// output: undefined
上記のコード ブロックは、角かっこ構文を使用して、10 進数表現で 1 番目と 3 番目のバイトの値を取得します。無効なバイトを取得しようとすると、未定義のエラーが発生します。
すべてのデータにアクセスするために、Buffer クラスにはメソッドtoJSON()およびtoString()が付属しており、これらは 2 つの異なる形式で内容を取得します。
toString ()メソッドは、バッファの内容として文字列を出力します。
const myBuf = Buffer.from('Mine');
console.log(myBuf.toString());
// output: 'Mine'
const numberBuf = Buffer.from([123]);
console.log(numberBuf.toString())
// output: '{'
const emptyBuf = Buffer.alloc(5);
console.log(emptyBuf.toString());
// output: '\\x00\\x00\\x00\\x00\\x00'
最初の呼び出しは、値「 Mine 」で Buffer を初期化し、 toString への呼び出しが複製します。2 番目の例では、初期化に single-int 配列を使用します。これは、” { ” 文字として文字列表現を持ちます。最後のケースでは、5 つの null 値を持つ Buffer は文字列「\x00\x00\x00\x00\x00」を返します。文字列\x00 は、null の 16 進数表現です。
.toJSON ()メソッドは、Buffer の初期化に使用したデータに関係なく、Buffer データの 10 進数表現を返します。
例えば:
const myBuf = Buffer.from('Mine');
console.log(myBuf.toJSON());
// output: { type: 'Buffer', data: [ 77, 105, 110, 101 ] }
JSON 出力には、出力元を示すBufferの値を持つtypeプロパティがあります。その data プロパティには、元のバイト配列を表す 10 進数の配列が格納されます。
バッファの変更
Buffer の個々のバイトにアクセスするのと同様に、角括弧構文を使用して Buffer の内容の個々のバイトを変更することもできます。
角括弧構文を使用して個々のコンテンツを変更する場合、値の 10 進数表現のみを割り当てることができます。
例えば:
myBuf[0] = 70
console.log(myBuf.toString())
// output: 'Fine'
バッファーはバイナリ データであるため、バッファーの特定の部分に文字列を指定することはできません。個々のバイトを文字列に設定しようとすると、Buffer はそれをヌル文字に変換します。
例えば:
myBuf[0] = 'F';
console.log(myBuf.toString());
// output: '\\x00ine'
または、 write()メソッドを使用して、バッファーの内容全体を変更することもできます。
バッファの長さの外側にインデックスを挿入することを検討してください。エラーを返すのではなく、Buffer は無効なインデックスを無視し、元の Buffer の内容をそのまま保持します。
たとえば、myBufの 5 番目の要素を114の 10 進数表現を介してrに設定してみてください。
myBuf[4] = 114;
console.log(myBuf.toString());
// output: 'Mine'
toString()メソッドが同じ値‘Mine’を返すことに注意してください。
Buffer のサイズを変更することはできないため、保持できる以上のデータを書き込もうとすると、余分なデータが破棄されます。例えば:
const buf1 = Buffer.alloc(5)
buf1.write('number');
console.log(buf1.toString())
// output: 'numbe'
toString()メソッドを使用してバッファ データを確認すると、 「number」ではなく「numbe」が返されます。write()メソッド内に挿入された引数です。
バッファーは、インデックス 0 から順番に書き込みます。write ()メソッドは、バッファにバイトを連続的に追加し、以前のデータを上書きします。
例えば:
const buf2 = Buffer.alloc(6);
buf2.write('member');
console.log(buf2.toString())
// output: 'member'
buf2.write('hi');
console.log(buf2.toString());
// output: 'himber'
上記のコードは、6 バイトのバッファーを作成し、 write()メソッドを使用して文字列「member」を追加します。
次に、以前のコンテンツよりもメモリ スペースを占有しない新しいコンテンツでバッファを更新します。
これにより、最初の 2 バイトが上書きされ、残りのバイトが変更されない新しい文字列が作成されます。
多くの API とデータ構造はバッファを使用します
これで、バッファを作成し、バッファに書き込み、その内容を読み取り、適切なメソッドで変更する方法がわかりました。
Node.js Buffer クラスで使用できるメソッドは他にもいくつかあります。
ストリームやファイル システムなどのさまざまな概念がどのように機能するかを理解するには、これらの方法を理解し、バッファーを理解する必要があります。
コメントを残す