NodeJS の Buffer の簡単な分析

青灯夜游
青灯夜游転載
2020-11-18 17:59:512633ブラウズ

NodeJS の Buffer の簡単な分析

関連する推奨事項: 「node js チュートリアル

Node を使い始めるために、Pu Ling の Nine Lights and One Deep NodeJS を読みました。 , Park Dada の本では実践についてはほとんど語られておらず、原則の説明に多くのスペースが割かれています。非常に多くの原則を聞いた後、彼は後にフロントエンド エンジニアリングの分野で NodeJS を使い始めましたが、あらゆるところで妨げられました。理由を要約すると、彼は次のように発見しました。 NodeJS の難しい部分は、ファイルとファイルにすぎないということです。ネットワーク、ファイル操作、およびネットワークはすべて、非常に重要なオブジェクトであるストリームに依存しています。これは、まさに Park が著書で言及していないことです。

Buffer Park Dada が本の中で言及しましたが、ストリームは実際にバッファを処理しているため、まだ簡単に要約する必要があります。

Buffer とは

#公式 API で紹介されているように、ES6 で TypedArray が導入される前は、JavaScript にはバイナリ データ ストリームを読み取ったり操作したりするメカニズムがありませんでした。 Buffer クラスは、TCP やファイル ストリームなどのネットワーク ストリームと対話できるようにするために、NodeJS API の一部として導入されました。

TypedArray が ES6 に追加されたため、Buffer クラスは、より最適化され NodeJS 操作に適した方法で Unit8Array API を実装します。

つまり、Buffer クラスはバイナリ データを処理するために使用されますが、非常に一般的に使用されるため、グローバル変数に直接配置され、使用時に require する必要はありません。

Buffer クラスのインスタンスは整数配列に似ていますが、バッファーのサイズは作成時に決定され、調整できません。 Buffer オブジェクトとの違いは、V8 のメモリ割り当てメカニズムを経由しないことです。Buffer は JavaScript と C を組み合わせたモジュールです。メモリは C によって適用され、JavaScript によって割り当てられます。

バッファ メモリ割り当てに関する関連知識については説明しません。興味のある学生は Park Laoshi の本を読んでください。

バッファーのインスタンス化

NodeJS v6 より前では、バッファーはコンストラクターを呼び出すことによってインスタンス化され、パラメーターに従って異なる結果を返しました。セキュリティ上の理由から、このメソッドは v6 以降のバージョンでは廃止され、

#Buffer.from()
  • Buffer.alloc()
  • ## が提供されています。 allocUnsafe()
  • 明確な役割を持つ 3 つの個別の関数が、Buffer のインスタンス化の作業を処理します。

Buffer.from(array): 指定されたバイトのコピーを含むバッファを返します。配列内の各項目はオクテットを表す数値であるため、値は 0 ~ 255 の間である必要があります。それ以外の場合は、モジュロになります。

    Buffer.from(arrayBuffer): 指定された ArrayBuffer とメモリを共有する新しいバッファを返します。
  • Buffer.from(buffer): 指定されたバッファを返します。 バッファのコピー
  • Buffer.from(string [, encoding]): 指定された文字列を含むバッファを返します。
  • Buffer.alloc(size [, fill [, encoding]]) : 指定された文字列のバッファを返します。指定されたサイズと "filled"
  • Buffer.allocUnsafe(size): 指定されたサイズのバッファを返します。コンテンツは buf.fill(0)
// 0x 表示 16 进制

Buffer.from([1, 2, 3]) // [0x1, 0x2, 0x3]

Buffer.from('test', 'utf-8') // [0x74, 0x65, 0x73, 0x74]

Buffer.alloc(5, 1) // [0x1, 0x1, 0x1, 0x1, 0x1]

Buffer.allocUnsafe(5); // 值不确定,后面详谈
# などのメソッドで埋める必要があります。
  • ##Buffer.allocUnsafe()
  • は Buffer.alloc()

    よりも高速に実行されます。名前を見ると安全ではありませんし、実際に安全ではありません。 Buffer.allocUnsafe() が呼び出されたとき、割り当てられたメモリ セグメントは初期化されていない (ゼロに戻されていない) ため、メモリ割り当て速度は非常に遅くなりますが、割り当てられたメモリ セグメントは古いデータが含まれている可能性があります。これらの古いデータを上書きして使用しないと、メモリリークが発生する可能性がありますので、高速ではありますが、使用は避けてください。

    エンコーディング

    バッファは次のエンコーディング形式をサポートしています

    ascii

    utf8
    • utf16le
    • base64
    • binary
    • hex
    • バッファと文字列の変換

    文字列からバッファへの変換は相対的に行われます。 simple
    Buffer.from(string [, encoding])
    同時に、Buffer インスタンスには、Buffer を文字列に変換する toString メソッドもあります

    buf.toString([encoding[, start[, end]]])

    Buffer splicing

    Use複数の Buffer インスタンスを話す concat メソッドは 1 つの Buffer インスタンスに結合されます
    Buffer.concat(list[, totalLength])

    StringDecoder

    NodeJS では、中国語の文字は 3 バイトで表されます。中国語の文字を処理する場合は、3 以外の値を使用してください。バイト数の倍数を使用すると、文字化けのスプライシングの問題が発生します。
    const buf = Buffer.from('中文字符串!');
    
    for(let i = 0; i < buf.length; i+=5){
      var b = Buffer.allocUnsafe(5);
      buf.copy(b, 0, i);
      console.log(b.toString());
    }
    結果には文字化けがあることがわかります

    しかし、string_decoderモジュールを使用すると、この問題を解決できます

    const StringDecoder = require('string_decoder').StringDecoder;
    const decoder = new StringDecoder('utf8');
    
    const buf = Buffer.from('中文字符串!');
    
    for(let i = 0; i < buf.length; i+=5){
      var b = Buffer.allocUnsafe(5);
      buf.copy(b, 0, i);
      console.log(decoder.write(b));
    }
    StringDecoder in エンコーディングを取得すると、UTF-8 ではワイド バイトが 3 バイトを占めることがわかります。そのため、最後に不完全なバイトを処理すると、2 回目の write() まで保持されます。現在、処理できるのは UTF-8、Base64、UCS-2/UTF-16LE のみです。

    Buffer 他の一般的に使用される API

    Buffer の一般的に使用される API もいくつかあります
    • Buffer.isBuffer: オブジェクトがバッファであるかどうかを判断します。
    • Buffer.isEncoding: バッファ オブジェクトのエンコーディングを判断します。
    • buf.length: 要求されたメモリのバイト数を返します。このバッファ インスタンスの数値はバッファ インスタンスのバイト数ではありません。 content
    • buf.indexOf: 配列の IndexOf と同様に、変更されたファイル内の特定の文字列、ACSI コード、または buf の位置を返します。 buf
    • buf.copy: ある buf の内容 (一部) を別の buf

    プログラミング関連の知識については、プログラミング ビデオ##を参照してください。 #! !

    以上がNodeJS の Buffer の簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。