Node.js開発入門-Bufferの使い方の詳細


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メソッドに必要なコールバック関数のプロトタイプは次のとおりです.
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メソッドの最初のパラメータは符号化タイプであり、一般的な符号化フォーマットをサポートしています.
  • 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プロトタイプ:
    buf.toString([encoding][, start][, end])
    

    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のインスタンスを作成できます.
    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は、バッファに文字列を書き込み、実際に書き込まれたバイト数を返すために使用されます.パラメータの意味は次のとおりです.
  • 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()が呼び出されます.例:
    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));
    

    その他の記事:
  • 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