Nodeバイナリbufferオブジェクト

8354 ワード

概要
ノードでは、アプリケーションは、ネットワークプロトコル、オペレーティングデータベース、画像処理、アップロードファイル受信などの処理が必要であり、ネットワークフローとファイルの操作において、大量のバイナリデータを処理しなければならず、ES 6がTypedArayを導入する前に、JavaScript言語は、二進データストリームを読み取ったり、操作したりしない仕組みが必要となり、Buffer類はNodejs APIの一部として導入される.TCPフローやファイルシステムの動作などのシーンでバイナリデータストリームを処理することができるようにする.現在はTypedArayがES 6に追加されており、Buffer類はより優れていて、Node.jsに適した用例でUint 8 Arayを実現しています.Bufferは典型的なJavaScriptとC+を組み合わせたモジュールであり、性能関連部分をC++で実現し、非性能関連部分をJavaScriptで実現する.Bufferクラスの例は、サイズが固定されており、V 8スタックの外に物理メモリが割り当てられている整数配列と類似している.Bufferのサイズは作成時に決定されていて、サイズの調整はできません.Bufferがあまりにも一般的なので、Nodeはプロセス起動時にすでにそれをロードし、グローバルオブジェクトに置いています.ですから、Bufferを使う時は、requireを通さずにそのまま使えます.
{ [Function: Buffer]
  poolSize: 8192,
  from: [Function: from],
  of: [Function: of],
  alloc: [Function: alloc],
  allocUnsafe: [Function: allocUnsafe],
  allocUnsafeSlow: [Function: allocUnsafeSlow],
  isBuffer: [Function: isBuffer],
  compare: [Function: compare],
  isEncoding: [Function: isEncoding],
  concat: [Function: concat],
  byteLength: [Function: byteLength],
  [Symbol(kIsEncodingSymbol)]: [Function: isEncoding] }
作成
Node.js v 6の前のバージョンにおいて、Buffer例はBufferコンストラクションによって作成され、提供されたパラメータに従って異なるBufferに戻り、新しいバージョンのnodejsは対応する方法を提供する.1、new Buffer.一つの数値を最初のパラメータとしてBuffer(new Buffer(10))に渡すと、指定されたサイズの新しいBufferオブジェクトが割り当てられます.このようなBufferのインスタンスに割り当てられたメモリは初期化されていない(0で充填されていない).このような設計はメモリの割り当てを非常に速くするが、割り当てられたメモリセグメントは潜在的に敏感で古いデータを含むかもしれない.このようなBufferのインスタンスは、手動で初期化されなければならない.このBufferは、buf.fill(0)を使用してもよいし、またはいっぱい書いてもよい.このような挙動は性能を向上させるために意図されているが、開発経験により、高速で初期化されていないBufferを作成することと、より安全なBufferを作成することとの間には、より明確な区別が必要であることがわかった.【注意】Bufferオブジェクトに空間サイズを割り当てると、その長さは固定されていますので、変更できません.
var buf = new Buffer(5);
console.log(buf);//
buf[0] = 1;
console.log(buf);//
buf[10] = 1;
console.log(buf);//
【Buffer.alloc Unisafe】新バージョンでは、Buffer.alloc Unisafe(size)方法によって代替され、sizeバイトの大きさの新規作成された0で充填されていないBufferを割り当てる.BUF.fill(0)を使用してBufferを初期化することができる例は0である.
var buf = Buffer.allocUnsafe(10);
console.log(buf);//
buf.fill(0);
console.log(buf);//
【Buffer.alloc】新しいバージョンでは、Buffer.alloc方法を使用して、安全なブザーオブジェクトを生成し、パラメータsizeによって新たに作成されたBufferが望む長さ.fill𞓜は、新規作成したBufferの値を事前に充填するために使用されます.デフォルト:0;encodingはfillが文字列であれば、その値は文字コードです.デフォルト:'utf 8'サイズがsizeバイトの新規Bufferを割り当てます.fillがundefinedであれば、このBufferは0で充填されます.
var buf = Buffer.alloc(5);
console.log(buf);//
  2、new Buffer.1つの配列またはBufferを最初のパラメータとして伝えると、送信対象のデータをBufferにコピーします.
var buf1 = new Buffer([1, 2, 3, 4, 5]);
console.log(buf1);//
var buf2 = new Buffer(buf1);
console.log(buf2);//
【Buffer.from】新しいバージョンでは、Buffer.from方法によって代替されます.
var buf1 = Buffer.from([1, 2, 3, 4, 5]);
console.log(buf1);//
var buf2 = Buffer.from(buf1);
console.log(buf2);//
  3、new Buffer(string[、encoding]).最初のパラメータは文字列で、2番目のパラメータは符号化方式で、デフォルトは「utf-8」です.
var buf1 = new Buffer('this is a tést');
console.log(buf1.toString());//this is a tést
console.log(buf1.toString('ascii'));//this is a tC)st
var buf2 = new Buffer('7468697320697320612074c3a97374', 'hex');
console.log(buf2.toString());//this is a tést
  Node.js現在サポートされている文字コードには、以下のようなものが含まれています.
'ascii' -     7   ASCII   。          ,         。
'utf8' -        Unicode   。               UTF-8 。
'utf16le' - 2   4    ,        Unicode   。     (U+10000   U+10FFFF)。
'ucs2' - 'utf16le'    。
'base64' - Base64   。        Buffer  ,       “URL          ”。
'latin1' -     Buffer                。
'binary' - 'latin1'    。
'hex' -                 。
  4、new Buffer(arrayBuffer[、byteOffset[、length]]).ArayBufferパラメータ、またはTypedArayの.buffer属性.byteOffsetがコピーしたインデックスを開始します.デフォルトは0ですlengthコピーのバイト数.デフォルトはarrayBuffer.length-byteOffsetです.
var arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;
var buf = new Buffer(arr.buffer);
console.log(buf);//
arr[1] = 6000;
console.log(buf);//
【Buffer.from】新しいバージョンでは、Buffer.from(arrayBuffer[,byteOffset[,length]]によって代替されます.
var arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;
var buf = Buffer.from(arr.buffer);
console.log(buf);//
arr[1] = 6000;
console.log(buf);//
【クラス配列】Bufferオブジェクトは配列に似ています.要素は16進数の2桁、つまり0から255までの数値です.
console.log(Buffer.from('test'));//
【長さ】異なる符号化された文字列に占める要素の個数はそれぞれ異なり、中文字はUTF-8符号化で3つの要素を占め、アルファベットと半角句読点は1つの要素を占有する.
var buf = Buffer.from('zyb');
console.log(buf.length);//3
var buf = Buffer.from('    ');
console.log(buf.length);//12
【下付き】BufferはArayタイプの影響が大きいので、length属性にアクセスして長さを得ることができます.また、下付きで要素にアクセスすることもできます.
var buf = Buffer.alloc(10); 
console.log(buf.length); // => 10
上記のコードには長い10バイトのBufferオブジェクトが割り当てられています.私たちは下の標識を通してそれを賦課することができます.
buf[0] = 100;
console.log(buf[0]); // => 100
要素への割当値が0より小さい場合は、その値を1つの0から255の間の整数を得るまで、256を逐次加算することに注意したい.得られた数値が255より大きい場合、0から255の区間の数値を得るまで、256を順次減らします.小数点以下なら、小数点を切り捨てて、整数部分だけを残します.
buf[0] = -100;
console.log(buf[0]); // 156
buf[1] = 300;
console.log(buf[1]); // 44
buf[2] = 3.1415;
console.log(buf[2]); // 3
【froomcharcode】通常、作成されたbufferオブジェクトの内容は、そのuft-8文字コードである.
var buf = Buffer.from('zyb'); 
console.log(buf); //
  該当する文字にアクセスするには、文字列のfrom CharCodeを使用する必要があります.
console.log(String.fromCharCode(buf[0]));//'z'
メモリ割り当て
  Bufferオブジェクトのメモリ割り当てはV 8のヒープメモリではなく、NodeのC++レベルでメモリの申請を実現します.大量のバイトデータを処理するにはメモリが必要なので、オペレーティングシステムにメモリを少し申請する方式は採用できません.これは大量のメモリ申請のシステム呼び出しを引き起こし、オペレーティングシステムに一定の圧力がかかります.このためにNodeがメモリの使用に応用するのは、C++レベルでメモリを申請し、JavaScriptにメモリを割り当てるポリシーです.出願したメモリを効率的に使用するために、Nodeはslab割り当て機構を採用した.slabbは、サンズOSオペレーティングシステム(Solaris)の中で最初に誕生した動的メモリ管理機構であり、現在はFreeBSDやLinuxのようないくつかの*nixオペレーティングシステムにおいて広範な応用が行われています.簡単に言えば、slabは固定サイズを申請したメモリー領域です.slabは以下の3つの状態を有する.full:完全割当状態.partial:部分配分状態;empty:割り当てられていません.Bufferオブジェクトが必要な場合は、以下のように指定されたサイズのBufferオブジェクトを割り当てることができます.
new Buffer(size);// 
Buffer.alloc(size);// 
【poolSize】poolSize属性は、予め割り当てられた内部バッファerのインスタンスプールのサイズを決定するためのバイト数である.デフォルトでは、Nodeは8 KBを限界として、Bufferが大きいかそれとも小さいかを区別します.Buffer.poolSize=8*1024;この8 KBの値、つまり各slabの大きさの値は、JavaScriptレベルで、単位セルとしてメモリの割り当てを行います.
転化する
Bufferオブジェクトは文字列と相互に変換することができる.現在サポートされている文字列コードの種類は以下の通りです.ASCII、UTF-8、UTF-16 LE/UCS-2、Base 64、Binary、Hex.
【write()】Bufferオブジェクトは、異なる符号化タイプの文字列トランスコードの値を記憶し、write()メソッドを呼び出してその目的を達成することができる.buf.write(string,offset,length,encoding)stringは、bufに書き込む文字列offsetでstringの位置を書き始めます.デフォルト:0 lengthを書き込むバイト数.デフォルト:buf.length-offset encoding stringの文字コードです.デフォルト:'utf 8';は、書き込みバイト数は、encodingの文字コードに従ってstringをbufのoffset位置に書き込みます.lengthパラメータは書き込みのバイト数です.bufが文字列全体を保存する十分な空間がない場合は、stringの一部だけを書き込み、部分的に復号された文字だけは書き込まれません.
var buf = Buffer.alloc(5); 
console.log(buf); //
var len = buf.write('test',1,3);
console.log(buf);//
console.log(len);/3
Bufferオブジェクトには絶えず書き込むことができ、書き込みごとに符号化を指定することができるので、Bufferオブジェクトには複数の符号化変換されたコンテンツが存在することができる.注意したいのは、各符号化に使うバイトの長さが違っていて、Bufferを文字列に戻す場合は慎重な処理が必要です.
【tostring()】Bufferから文字列への変換も簡単であり、BufferオブジェクトのtoString()はBufferオブジェクトを文字列に変換することができる.buf.toStering([encoding],[start],[end]encoding-で使用するコードです.デフォルトでは'utf 8'start-読み出し開始インデックス位置を指定し、デフォルトでは0 end-終了位置となり、デフォルトではバッファの末尾に-復号バッファデータを返し、指定された符号化を使って文字列に戻ります.
var buf =Buffer.alloc(26);
for (var i = 0 ; i < 26 ; i++) {
  buf[i] = i + 97;
}
console.log( buf.toString('ascii'));//abcdefghijklmnopqrstuvwxyz
console.log( buf.toString('ascii',0,5));//abcde
console.log( buf.toString('utf8',0,5));//abcde
console.log( buf.toString(undefined,0,5));//abcde
【toJSON()】Node BufferをJSONオブジェクトbuf.toJSON()に変換してbufに戻るJSONフォーマット
var buf = Buffer.from('test');
var json = buf.toJSON(buf);
console.log(json);//{ type: 'Buffer', data: [ 116, 101, 115, 116 ] }