ノードのバッファへの完全なガイド.js


ノードで.JSバッファーは、生のバイナリデータを格納できるオブジェクトの特殊な型です.バッファはメモリのチャンクを表します-典型的にRAM -あなたのコンピュータで割り当てられます.一度設定すると、バッファのサイズを変更できません.
バッファはバイトを格納する.バイトは8ビットのシーケンスです.ビットは、コンピュータ上のストレージの最も基本的な単位です、彼らは0または1の値を保持することができます.
ノード.js露出Buffer グローバルスコープ内のクラス(他のモジュールのようにインポートするか、または必要とする必要はありません).このAPIを使用すると、生のバイナリを操作する関数と抽象化の一連の取得.
ノードのバッファ.JSは次のようになります.
<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
この例では、文字と数字の10組を見ることができます.各ペアは、バッファに格納されたバイトを表します.この特定バッファの総サイズは10である.
あなたは自分自身に尋ねているかもしれません
これはノードです.JSは16進数システムを使用してバイトを表示します.この方法では、すべてのバイトはわずか2桁-数字のペアと0から9までの文字と“A”を“F”を使用して表現することができます.
なぜバッファするかバッファが導入される前に、JavaScriptでバイナリデータを扱う簡単な方法はありませんでした.あなたは文字列のようなプリミティブに頼らなければならなくなります.バッファは、簡単で実行可能な方法でビットとバイトを操作するAPIの適切なセットを提供するために作成されました.

バッファの操作
バッファで何かできることを見ましょう.
バッファーバッファーは、JavaScriptで配列を処理する方法に似ています.例えば、あなたは.slice() , .concat() そして、.length を返します.バッファはiterableでもあり、for-of .
お使いのコンピュータの例に従っている場合は、心に留めてくださいBuffer クラスはグローバルに公開されます.インポートまたは別のモジュールとしてそれを必要とする必要はありません.

バッファの作成
バッファはこれらの3つのメソッドを使用して作成されます.
  • バッファ.from ()
  • バッファ.array ()
  • バッファ.allocunsafe ()
  • In the past, buffers were created using the Buffer class constructor (e.g., new Buffer()). This syntax is now deprecated.


    バッファ.from ()
    このメソッドはバッファを作成する最も簡単な方法です.文字列、配列、ArrayBuffer , または別のバッファインスタンス.あなたがパスするどのパームによって.Buffer.from() バッファを少し異なる方法で作成します.
    文字列を渡すとき、その文字列を含む新しいバッファーオブジェクトが作成されます.デフォルトでは、入力としてUTF - 8を使用して入力を解析しますhere サポートされるすべての型)
    // Creates a new buffer with the string 'heya!'
    // If no enconding is passed in the second parameter, defaults to 'utf-8'.
    Buffer.from("heya!");
    
    // Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
    Buffer.from("6865796121", "hex");
    
    また、Buffer.from() . 私は以前と同じ文字列を渡しています.しかし、16進文字の配列として表されます:
    // Also writes 'heya!' to the buffer, but passes a array of bytes
    Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
    

    If you're not familar with the 0xNN syntax, it means that the characters after 0x should be interpreted as hexadecimal values.


    バッファを渡すときBuffer.from() , ノード.JSはそのバッファを現在のものにコピーします.新しいバッファはメモリの異なる領域に割り当てられます.
    const buffer1 = Buffer.from("cars");
    
    // Creates a buffer from `buffer1`
    const buffer2 = Buffer.from(buffer2);
    
    // Modify `buffer2`
    buffer2[0] = 0x6d; // 0x6d is the letter "m"
    
    console.log(buffer1.toString()); // --> "cars"
    console.log(buffer2.toString()); // --> "mars"
    
    これらはあなたが使用するケースのほとんどをカバーする必要がありますBuffer.from() . 参照docs 他の方法で使用します.
    バッファ.array ()
    The .alloc() メソッドを使用すると、空のバッファを作成したい場合は、必ずデータを埋めずに便利です.デフォルトで、それは数を受け入れて、sで満たされる与えられたサイズのバッファを返します:
    Buffer.alloc(6);
    // --> <Buffer 00 00 00 00 00 00>
    
    後でバッファに書き込むには任意のデータを入力します.
    // Creates a buffer of size 1 filled with 0s (<Buffer 00>)
    const buff = Buffer.alloc(1);
    
    // Fill the first (and only) position with content
    buff[0] = 0x78 // 0x78 is the letter "x"
    
    console.log(buff.toString('utf-8');
    // --> 'x'
    
    また、バッファに0以外の内容を指定することもできます.
    Buffer.alloc(6, "x", "utf-8");
    // --> <Buffer 78 78 78 78 78 78>
    
    バッファ.allocunsafe ()
    With .allocUnsafe() , バッファを0 . 5で消毒し,充填する工程を省略した.バッファは古いデータを含んでいるかもしれないメモリの領域に割り当てられます.たとえば、次のコードは、常に実行するたびにいくつかのランダムなデータを出力します.
    // Allocates a random area of memory with size 10000
    // Does not sanitizes it (fill with 0) so it may contain old data
    const buff = Buffer.allocUnsafe(10000);
    
    // Prints loads of random data
    console.log(buff.toString("utf-8"));
    
    良いユースケース.allocUnsafe() 安全に割り当てられたバッファーをコピーするときです.コピーされたバッファを完全に上書きするので、古いバイトはすべて予測可能なデータに置き換えられます.
    // Creates a buffer from a string
    const buff = Buffer.from("hi, I am a safely allocated buffer");
    
    // Creates a new empty buffer with `allocUnsafe` of the same
    // length as the previous buffer. It will be initally filled with old data.
    const buffCopy = Buffer.allocUnsafe(buff.length);
    
    // Copies the original buffer into the new, unsafe buffer.
    // Old data will be overwritten with the bytes
    // from 'hi, I am a safely allocated buffer' string.
    buff.copy(buffCopy);
    
    console.log(buffCopy.toString());
    // --> 'hi, I am a safely allocated buffer'
    
    概して.allocUnsafe() 十分な理由(例えば、パフォーマンス最適化)があれば使用するべきです.それを使用するときはいつでも、割り当てられたバッファを全く新しいデータで完全に満たすことなく、決して返さないようにしてください.さもなければ、あなたは潜在的に機密情報を漏らしているかもしれません.

    バッファへの書き込み
    データをバッファに書き込む方法はBuffer.write() . デフォルトでは、utf-8 オフセットなし(バッファの最初の位置から書き込みを開始します).これは、バッファに書き込まれたバイト数です.
    const buff = Buffer.alloc(9);
    
    buff.write("hey there"); // returns 9 (number of bytes written)
    
    // If you write more bytes than the buffer supports,
    // your data will truncated to fit the buffer.
    buff.write("hey christopher"); // retuns 9 (number of bytes written)
    
    console.log(buff.toString());
    // -> 'hey chris'
    
    全ての文字がバッファに入っていないことを覚えておいてください.
    const buff = Buffer.alloc(2);
    
    // The copyright symbol ('©') occupies two bytes,
    // so the following operation will completely fill the buffer.
    buff.write("©"); // returns 2
    
    // If the buffer is too small to store the character, it will not write it.
    const tinyBuff = Buffer.alloc(1);
    
    tinyBuff.write("©"); // returns 0 (nothing was written)
    
    console.log(tinyBuff);
    // --> <Buffer 00> (empty buffer)
    
    また、2がキャラクタが持つことができるバイトの最高数でないことに注意してください.例えば、utf-8 エンコーディングタイプは最大4バイトの文字をサポートします.バッファのサイズを変更することができないので、常に何を書いているか、どのくらいのスペースがかかるかを考慮する必要があります.
    バッファーに書き込むもう一つの方法は、バッファの特定の位置にバイトを追加する構文のような配列です.1バイト以上のデータがバッファの各位置に故障して設定される必要があることに注意することが重要です.
    const buff = Buffer.alloc(5);
    
    buff[0] = 0x68; // 0x68 is the letter "h"
    buff[1] = 0x65; // 0x65 is the letter "e"
    buff[2] = 0x6c; // 0x6c is the letter "l"
    buff[3] = 0x6c; // 0x6c is the letter "l"
    buff[4] = 0x6f; // 0x6f is the letter "o"
    
    console.log(buff.toString());
    // --> 'hello'
    
    // ⚠️ Warning: if you try setting a character with more than 2 bytes
    // to a single position, it will fail:
    buff[0] = 0xc2a9; // 0xc2a9 is the symbol '©'
    
    console.log(buff.toString());
    // --> '�ello'
    
    // But if you write each byte separately...
    buff[0] = 0xc2;
    buff[1] = 0xa9;
    
    console.log(buff.toString());
    // --> '©llo'
    
    構文のような配列を使用してバッファに書き込むことができますが、私はBuffer.from() できるとき.入力の長さを管理するのは難しい仕事であり、あなたのコードに複雑さをもたらすでしょう.With .from() , バッファを心配して書くことができ、何も書かれていないかどうかをチェックすることによって入力が大きすぎる場合( 0を返す場合)を扱うことができます.

    バッファの反復処理
    現在のJavaScriptのコンストラクタを使用して、配列で同じ方法でバッファを反復処理できます.例えば、for-of :
    const buff = Buffer.from("hello!");
    
    for (const b of buff) {
      // `.toString(16)` returns the content in hexadecimal format.
      console.log(b.toString(16));
    }
    
    // Prints:
    // --> 68
    // --> 65
    // --> 6c
    // --> 6c
    // --> 6f
    // --> 21
    
    その他のイテレータヘルパー.entries() , .values() and .keys() バッファも利用可能です.例えば、.entries() :
    const buff = Buffer.from("hello!");
    const copyBuff = Buffer.alloc(buff.length);
    
    for (const [index, b] of buff.entries()) {
      copyBuff[index] = b;
    }
    
    console.log(copyBuff.toString());
    // -> 'hello!'
    

    さらに進んで:バッファとtypedarray
    JavaScript(私は一般的に、ノード. jsに制限されません)では、メモリは特別なArrayBuffer クラス.我々はめったに操作しないArrayBuffer 直接オブジェクト.代わりに、下にある配列バッファを参照する「ビュー」オブジェクトのセットを使用します.ビューオブジェクトの一部は以下の通りです:Int8Array , Uint8Array , Uint8ClampedArray , Int16Array , Uint16Array , Int32Array , などの完全なリストを参照してくださいhere .
    それからTypedArray , これらは、上記のビューオブジェクトの全てを参照するためのアンブレラタームです.すべてのビューオブジェクトはTypedArray プロトタイプ経由で.The TypedArray コンストラクターはグローバルに公開されませんので、常にビューメソッドのいずれかを使用する必要があります.いくつかのチュートリアルやドキュメントを使用する場合new TypedArray() , これは、ビューオブジェクト(UInt 8 Array、Float 64 Arrayなど)のいずれかを使用していることを意味します.
    ノードで.からのオブジェクトBuffer クラスもUint8Array . それらの間にはいくつかの小さな違いがありますhere .

    結論
    初心者として、バッファはノードで話題でした.JSは私を非常に混乱させました(別のものは流れていました、しかし、それはそれ自身のポストに値します).うまくいけば、私はバッファのまわりで概念のいくつかを分析して、バッファAPIの概観を与えることができました.