Node.js開発入門-Bufferの使い方の詳細
7719 ワード
Node.jsにはBufferクラスがあります.紹介しなければなりません.私たちがNode.jsをサービス端開発に使用するとき、http、tcp、udp、ファイルioなどの操作は、Bufferを使用しているので、それを離れるとほとんど游ぶことができません.
Bufferって何?
JavaScriptのStringオブジェクトは、文字列が格納され、Unicode符号化されています.
Bufferはバッファを表し、バイナリデータを格納し、バイトストリームである.私たちはネットワークで伝送するとき、このようなバイトストリームを伝送します.ファイルを書くときも、書かれたバイトストリームです.
コーディングフォーマット
文字列にはUTF-8などの符号化フォーマットがあります.Bufferには符号化フォーマットがありません.両者は互いに変換できる.変換時に符号化フォーマットを指定する必要があります.
以前に使用したhttpモジュール(Node.js開発入門-HTTPファイルサーバとNode.js開発入門-HelloWorld再分析を参照)では、http.createServerメソッドに必要なコールバック関数のプロトタイプは次のとおりです.
このコールバックの最初のパラメータ、req、タイプはhttp.IncomingMessageであり、http.IncomingMessageは読み取り専用のストリームであり、Readableインタフェースを実現し、stream.Readableが読み取ったデータ(dataイベントを傍受して処理できる)はBufferオブジェクトであり、バイトストリームである.私たちがプログラムで使うときは、Stringに変換することがよくあります.逆にres(タイプhttp.ServerResponse、書き込み可能なストリーム、Writableインタフェースを実現)は、ストリームの符号化フォーマットを設定するためのsetDefaultEncodingメソッドがあり、writeデータの場合、指定した符号化フォーマットを使用してデータを符号化し、クライアントに送信します.
すなわち,ネットワーク伝送はBufferであり,プログラムはStringを処理する必要があり,BufferとStringの間で変換できる.BufferにはtoStringメソッドがあり、指定された符号化フォーマットでバイトストリームをStringに変換できます.
また、ファイルシステムモジュール(Node.js開発入門を参照)、fs.createWriteStreamとfs.createReadStreamの2つの方法には、defaultEncodingを指定するオプションパラメータoptionsがあります.ここで指定した符号化フォーマットは、BufferとStringの間で変換するために使用されます.
現在、Node.jsでBufferが文字列に変換するとき、toStringメソッドの最初のパラメータは符号化タイプであり、一般的な符号化フォーマットをサポートしています. utf 8、マルチバイト符号化Unicode文字、ほとんどのドキュメントとウェブページはこの符号化フォーマット を採用している. ascii,8 bit符号化、1文字が1バイト を占める utf 16 le、小端符号化unicode文字 utf 16 be、大端符号化unicode ucs 2,unicode符号化、各文字は2バイト を占める base 64,Base-64文字列符号化 hex、各バイトは2つの16進数文字 に符号化される
符号化フォーマットが正しいかどうかを確認しない場合は、Buffer.isEncoding(encoding)メソッドを使用してテストできます.
BufferのtoStringメソッドを使用する場合、符号化フォーマットを指定しない場合は、デフォルトでutf 8を使用して変換されます.toStringプロトタイプ:
1番目のパラメータは符号化フォーマットで、2番目は開始位置(0からbuf.length-1)、3番目は終了位置(このインデックス位置を含まないデータ)です.
Bufferインスタンスの作成
newオペレータを使用して、Bufferインスタンスを作成するには4つの方法があります. new Buffer(size)、bufferのサイズを指定するbuffer を作成します. new Buffer(array)は、バイト配列に基づいてbuffer を作成する new Buffer(str[,encoding])は、文字列と符号化フォーマットに基づいてbufferを作成し、符号化を指定しない場合はutf 8 がデフォルトで使用されます. new Buffer(buffer)は、bufferインスタンスに基づいて新しいbuffer を作成する.
たとえば、次のコードはBufferのインスタンスを作成できます.
説明が必要ですが、new Buffer(size)で割り当てられたバッファは、初期化されていませんよ.そのメモリには、汚れているかもしれませんが、何でもあります.次のコードを試してみます.
上のコードはtoString変換Bufferを使用しようとしていますが、コンソールから多くの文字化けしが出力されているのが見えます.修正してbuf.fill()メソッドで埋め込むといいです.
文字列は「0」で終わり、buf 1.fill(0)を呼び出した後、すべてが安全です.
バッファへのデータの書き込み
前にbuf.writeメソッドを使用してバッファにデータを書き込みました.writeの原型は以下の通りです.
buf.writeは、バッファに文字列を書き込み、実際に書き込まれたバイト数を返すために使用されます.パラメータの意味は次のとおりです. string、書き込まれる文字列オブジェクト offset、バッファオフセット量、指定するとこの位置から書き込み、指定しないとデフォルト0 length、書き込むバイト数 encoding、文字列のような代謝の符号化フォーマット、デフォルトutf 8 Bufferには他にもバッファを操作する方法がたくさんあります.例えば、writeUIT 8、writeUIT 16 LE、writeUIT 16 BE、writeUIT 31 LE、writeUIT 32 BE、writeInt 8、writeInt 16 LE、writeInt 32 LEなどである.
LE-little endian、小端バイト順.BE-big endianは、エンドバイトシーケンス、すなわちネットワークバイトシーケンスである.
説明したいのは、writeXメソッドは、ファイルのように自動的に現在の位置を保存しませんよ.offsetを指定しないと、いつも0の位置から書きます.
その他、ドキュメントを見てみましょう・・・
バッファからデータを読み込む
buf.toStringは実はデータを読む方法です.もちろん、buf[index]は、下付き文字に基づいてバイトを読み取ることができます.buf.readIntox、buf.readUIntox......
buf.toJSON()は、1つのBufferオブジェクトをJSON形式に変換できます.Bufferオブジェクトに対してJSON.stringifyメソッドを呼び出すと、buf.toJSON()が呼び出されます.例:
バッファの長さ
Bufferオブジェクトのサイズは、作成時に固定され、作成後は変更できません.へへ、これは誤解を招きやすいです.特にBufferに文字列が保存されていると思ったら.次のコードを試してみると、この点を理解するのに役立ちます.
また、String.lengthが文字長を返すため、バッファ内で文字列が占有するバイト長を決定する場合は、文字列のlengthプロパティを使用することはできません.一方、UTF 8などの符号化形式で符号化された文字列については、1文字で複数バイトを占有する場合がある.したがって、String.lengthが表す文字列の長さとバイトの長さは一致しません.Buffer.lengthはバッファのバイト長を返し、作成時の長さであり、バッファ内容の変化に伴って変化しないことに注意してください.
文字列のバイト長を測定するには、Buffer.byteLength(string[,encoding])という方法を使用します.この方法では、指定した符号化フォーマットで文字列が占めるバイト長を測定します.
簡単な例を見てみましょう
バッファアクション
Bufferはまた、スライス、コピー、接合、比較などの操作をサポートします.
buf.slice([start[,end]]))は、開始位置(終了位置に対応するデータを含まない)に基づいてバッファをスライスし、新しいBufferオブジェクトを返し、バッファの領域を操作するのに便利です.しかし、このスライスはコピーではなく、既存のバッファへの参照であり、スライスの内容の変更は、実際には元のバッファを変更しています.この方法はスライスを表すBufferオブジェクトを返します.
buf.copy(targetBuffer[,targetStart][,sourceStart][,sourceEnd])は、1つのバッファ指定領域の内容を別のバッファ指定領域にコピーすることができる.C言語のmemcpyに似ています.targetStartはターゲットバッファの開始オフセットを指定し、sourceStartはソースバッファの開始オフセットを指定し、デフォルトは0です.sourceEndはソースバッファの終了位置を指定し、デフォルトはソースバッファの長さです.実際のレプリケーションでは、ターゲットバッファの長さとレプリケーション対象領域の長さを比較し、どちらを小さく押しても境界を越えません.
Bufferにはクラスメソッド、concat(list[,totalLength])があり、一連のバッファを1つにつなぐことができます.1番目のパラメータlistはバッファ配列であり、2番目は接合されるバッファの全長である.totalLengthを提供しない場合、concatはlistのバッファを巡って全長を計算し、パフォーマンスの損失が発生します.この方法は接合後のバッファを返す.
サンプルコードを見て、スライス、コピー、パッチの使用方法を説明します.
buf.equals(otherBuffer)は、現在のバッファが他のバッファと等しいかどうかを判断し、等しい場合はtrueを返します.
buf.compare(otherBuffer)は、現在のバッファと別のバッファのサイズを比較し、0を返し、戻り-1より小さく、戻り1より大きい.次のサンプルコードを見てください.
その他の記事: Node.js開発入門——音声合成例 Node.js開発入門——UDPプログラミング Node.js開発入門-httpを使用して外部世界 にアクセス Node.js開発入門——ソケットプログラミング Node.js開発入門-notepad++for Node.js Node.js開発入門-ダイアログngDialog を使用 Node.js開発入門-UIBootstrap を導入 Node.js開発入門——MongoDBでLoginDemo を改造する Node.js開発入門——MongoDBとMongoose Node.js開発入門-cookieを使用してログイン を維持 Node.js開発入門-AngularJS内蔵サービス を使用 Node.js開発入門-Angular簡単例 Node.js開発入門-AngularJS を使用 Node.js開発入門-jadeテンプレートエンジン を使用 Node.js開発入門-Expressのルーティングとミドルウェア Node.js開発入門-Expressインストールと使用 Node.js開発入門——HTTPファイルサーバー Node.js開発入門——HelloWorld再分析 Node.js開発入門-環境構築とHelloWorld
Bufferって何?
JavaScriptのStringオブジェクトは、文字列が格納され、Unicode符号化されています.
Bufferはバッファを表し、バイナリデータを格納し、バイトストリームである.私たちはネットワークで伝送するとき、このようなバイトストリームを伝送します.ファイルを書くときも、書かれたバイトストリームです.
コーディングフォーマット
文字列にはUTF-8などの符号化フォーマットがあります.Bufferには符号化フォーマットがありません.両者は互いに変換できる.変換時に符号化フォーマットを指定する必要があります.
以前に使用したhttpモジュール(Node.js開発入門-HTTPファイルサーバとNode.js開発入門-HelloWorld再分析を参照)では、http.createServerメソッドに必要なコールバック関数のプロトタイプは次のとおりです.
function (req, res)
このコールバックの最初のパラメータ、req、タイプはhttp.IncomingMessageであり、http.IncomingMessageは読み取り専用のストリームであり、Readableインタフェースを実現し、stream.Readableが読み取ったデータ(dataイベントを傍受して処理できる)はBufferオブジェクトであり、バイトストリームである.私たちがプログラムで使うときは、Stringに変換することがよくあります.逆にres(タイプhttp.ServerResponse、書き込み可能なストリーム、Writableインタフェースを実現)は、ストリームの符号化フォーマットを設定するためのsetDefaultEncodingメソッドがあり、writeデータの場合、指定した符号化フォーマットを使用してデータを符号化し、クライアントに送信します.
すなわち,ネットワーク伝送はBufferであり,プログラムはStringを処理する必要があり,BufferとStringの間で変換できる.BufferにはtoStringメソッドがあり、指定された符号化フォーマットでバイトストリームをStringに変換できます.
また、ファイルシステムモジュール(Node.js開発入門を参照)、fs.createWriteStreamとfs.createReadStreamの2つの方法には、defaultEncodingを指定するオプションパラメータoptionsがあります.ここで指定した符号化フォーマットは、BufferとStringの間で変換するために使用されます.
現在、Node.jsでBufferが文字列に変換するとき、toStringメソッドの最初のパラメータは符号化タイプであり、一般的な符号化フォーマットをサポートしています.
符号化フォーマットが正しいかどうかを確認しない場合は、Buffer.isEncoding(encoding)メソッドを使用してテストできます.
BufferのtoStringメソッドを使用する場合、符号化フォーマットを指定しない場合は、デフォルトでutf 8を使用して変換されます.toStringプロトタイプ:
buf.toString([encoding][, start][, end])
1番目のパラメータは符号化フォーマットで、2番目は開始位置(0からbuf.length-1)、3番目は終了位置(このインデックス位置を含まないデータ)です.
Bufferインスタンスの作成
newオペレータを使用して、Bufferインスタンスを作成するには4つの方法があります.
たとえば、次のコードはBufferのインスタンスを作成できます.
var buf1 = new Buffer(256);
var buf2 = new Buffer("Hello Buffer");
var buf3 = new Buffer([0x65,0x66,0x67]);
var buf4 = new Buffer(buf2);
説明が必要ですが、new Buffer(size)で割り当てられたバッファは、初期化されていませんよ.そのメモリには、汚れているかもしれませんが、何でもあります.次のコードを試してみます.
var buf1 = new Buffer(256);
buf1.write('abc');
console.log("buf1\'s content: ", buf1.toString());
上のコードはtoString変換Bufferを使用しようとしていますが、コンソールから多くの文字化けしが出力されているのが見えます.修正してbuf.fill()メソッドで埋め込むといいです.
var buf1 = new Buffer(256);
buf1.fill(0);
buf1.write('abc');
console.log("buf1\'s content: ", buf1.toString());
文字列は「0」で終わり、buf 1.fill(0)を呼び出した後、すべてが安全です.
バッファへのデータの書き込み
前にbuf.writeメソッドを使用してバッファにデータを書き込みました.writeの原型は以下の通りです.
buf.write(string[, offset][, length][, encoding])
buf.writeは、バッファに文字列を書き込み、実際に書き込まれたバイト数を返すために使用されます.パラメータの意味は次のとおりです.
LE-little endian、小端バイト順.BE-big endianは、エンドバイトシーケンス、すなわちネットワークバイトシーケンスである.
説明したいのは、writeXメソッドは、ファイルのように自動的に現在の位置を保存しませんよ.offsetを指定しないと、いつも0の位置から書きます.
その他、ドキュメントを見てみましょう・・・
バッファからデータを読み込む
buf.toStringは実はデータを読む方法です.もちろん、buf[index]は、下付き文字に基づいてバイトを読み取ることができます.buf.readIntox、buf.readUIntox......
buf.toJSON()は、1つのBufferオブジェクトをJSON形式に変換できます.Bufferオブジェクトに対してJSON.stringifyメソッドを呼び出すと、buf.toJSON()が呼び出されます.例:
var buf = new Buffer('test');
var json = JSON.stringify(buf);
console.log(json);
// '{"type":"Buffer","data":[116,101,115,116]}'
バッファの長さ
Bufferオブジェクトのサイズは、作成時に固定され、作成後は変更できません.へへ、これは誤解を招きやすいです.特にBufferに文字列が保存されていると思ったら.次のコードを試してみると、この点を理解するのに役立ちます.
var buf1 = new Buffer(256);
buf1.fill(0);
buf1.write('abc');
console.log("buf1\'s length - %d, not 3
", buf1.length);
buf1.write('abcdef');
console.log("buf1\'s length - %d, not 6
", buf1.length);
また、String.lengthが文字長を返すため、バッファ内で文字列が占有するバイト長を決定する場合は、文字列のlengthプロパティを使用することはできません.一方、UTF 8などの符号化形式で符号化された文字列については、1文字で複数バイトを占有する場合がある.したがって、String.lengthが表す文字列の長さとバイトの長さは一致しません.Buffer.lengthはバッファのバイト長を返し、作成時の長さであり、バッファ内容の変化に伴って変化しないことに注意してください.
文字列のバイト長を測定するには、Buffer.byteLength(string[,encoding])という方法を使用します.この方法では、指定した符号化フォーマットで文字列が占めるバイト長を測定します.
簡単な例を見てみましょう
var name = new String('who is \u5F20\u4E09\u4E30?');
console.log('name.length = %d', name.length);
console.log('byteLength = %d', Buffer.byteLength(name, 'utf8'));
バッファアクション
Bufferはまた、スライス、コピー、接合、比較などの操作をサポートします.
buf.slice([start[,end]]))は、開始位置(終了位置に対応するデータを含まない)に基づいてバッファをスライスし、新しいBufferオブジェクトを返し、バッファの領域を操作するのに便利です.しかし、このスライスはコピーではなく、既存のバッファへの参照であり、スライスの内容の変更は、実際には元のバッファを変更しています.この方法はスライスを表すBufferオブジェクトを返します.
buf.copy(targetBuffer[,targetStart][,sourceStart][,sourceEnd])は、1つのバッファ指定領域の内容を別のバッファ指定領域にコピーすることができる.C言語のmemcpyに似ています.targetStartはターゲットバッファの開始オフセットを指定し、sourceStartはソースバッファの開始オフセットを指定し、デフォルトは0です.sourceEndはソースバッファの終了位置を指定し、デフォルトはソースバッファの長さです.実際のレプリケーションでは、ターゲットバッファの長さとレプリケーション対象領域の長さを比較し、どちらを小さく押しても境界を越えません.
Bufferにはクラスメソッド、concat(list[,totalLength])があり、一連のバッファを1つにつなぐことができます.1番目のパラメータlistはバッファ配列であり、2番目は接合されるバッファの全長である.totalLengthを提供しない場合、concatはlistのバッファを巡って全長を計算し、パフォーマンスの損失が発生します.この方法は接合後のバッファを返す.
サンプルコードを見て、スライス、コピー、パッチの使用方法を説明します.
var buf1 = new Buffer('1234');
var buf2 = new Buffer('12567');
var bufList = [buf1, buf2];
var buf3 = Buffer.concat(bufList);
console.log('buf3 - %s', buf3.toString());
var buf4 = buf3.slice(3, 8);
console.log('buf4 - %s', buf4.toString());
var buf5 = new Buffer(5);
buf3.copy(buf5, 0, 1);
console.log('buf5 - %s', buf5.toString());
buf.equals(otherBuffer)は、現在のバッファが他のバッファと等しいかどうかを判断し、等しい場合はtrueを返します.
buf.compare(otherBuffer)は、現在のバッファと別のバッファのサイズを比較し、0を返し、戻り-1より小さく、戻り1より大きい.次のサンプルコードを見てください.
var buf1 = new Buffer('1234');
var buf2 = new Buffer('12567');
var buf3 = new Buffer('1234');
var buf4 = new Buffer('0123');
console.log('buf1.compare(buf2) = ', buf1.compare(buf2));
console.log('buf1.compare(buf3) = ', buf1.compare(buf3));
console.log('buf1.compare(buf4) = ', buf1.compare(buf4));
その他の記事: