関連する推奨事項: 「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
-
- バッファと文字列の変換
文字列からバッファへの変換は相対的に行われます。 simpleBuffer.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 サイトの他の関連記事を参照してください。