JavaScriptは文字列の取り扱いが得意ですが、もともとHTMLドキュメントを処理するように設計されていたため、バイナリデータの処理はあまり良くありません。 JavaScriptには、バイトタイプも構造化されたタイプもなく、バイト配列も、数字と文字列のみがありません。 (元のテキスト:JavaScriptにはバイトタイプがありません - 数字があります - または構造化されたタイプ、またはhttp://skylitecellars.com/
ノードはJavaScriptに基づいているため、HTTPのようなテキストプロトコルを自然に処理できますが、データベース、プロセス画像、またはファイルアップロードなどと対話するために使用することもできます。以前は、ノードはバイトをテキスト文字にエンコードすることでバイナリデータを処理しましたが、この方法は後に実行不可能で、リソースを無駄にし、ゆっくりと柔軟性があり、維持が困難であることが証明されました。
ノードにはバイナリバッファ実装バッファーがあります。この擬似クラスは、バイナリデータを処理するための一連のAPIを提供し、バイナリデータを処理する必要があるタスクを簡素化します。バッファーの長さはバイトデータの長さによって決定され、バッファ内のバイトデータをランダムに設定して取得できます。
注:バッファクラスには特別な場所があります。バッファ内のバイトデータが占めるメモリは、javascrpで割り当てられていません。
VMメモリヒープ、つまり、これらのオブジェクトはJavaScriptのGarbage Collection Algorithmによって処理されず、変更されない永続的なメモリアドレスに置き換えられます。
バッファを作成します
このようなUTF-8文字列でバッファを作成できます。
コードコピーは次のとおりです。
var buf = new Buffer( 'Hello World!');
指定されたエンコードでバッファを作成することもできます。
コードコピーは次のとおりです。
var buf = new Buffer( '8b76fde713ce'、 'base64');
許容可能な文字エンコードと識別は次のとおりです。
1.Ascii-asci、ASCII文字セットにのみ適用できます。
2.UTF8-UTF-8、この可変幅のエンコードは、Unicode文字セットの任意の文字に適しています。これは、Webの世界で優先エンコードになり、デフォルトのエンコードタイプのノードでもあります。
3.Base64 -Base64、このエンコードは、バイナリデータを表す64の印刷可能なASCII文字に基づいています。 Base64は通常、文字ドキュメントの文字列に変換できるバイナリデータを埋め込むために使用され、必要に応じて元のバイナリ形式に無傷で損失を無効に変換できます。
バッファを初期化するデータがない場合は、指定された容量サイズで空のバッファーを作成できます。
コードコピーは次のとおりです。
var buf = new Buffer(1024); // 1024バイトバッファを作成します
バッファーデータを取得して設定します
バッファーされたオブジェクトを作成または受信した後、その内容を表示または変更することができます。 []演算子を介してバッファーの特定のバイトにアクセスできます。
コードコピーは次のとおりです。
var buf = new Buffer( '私のバッファコンテンツ');
//バッファ内の10番目のバイトにアクセスします
console.log(buf [10]); //-> 99
注:初期化されたバッファー(バッファ容量サイズを使用)を作成する場合、バッファーデータは0に初期化されていないが、ランダムデータであることに注意してください。
コードコピーは次のとおりです。
var buf = new Buffer(1024);
console.log(buf [100]); //-> 5(ある程度のランダム値)
このようなバッファーのどこでもデータを変更できます。
コードコピーは次のとおりです。
buf [99] = 125; // 100番目のバイトの値を125に設定します
注:場合によっては、一部のバッファリング操作では、次のようなエラーが発生しません。
1.バッファ内のバイトの最大値は255です。バイトに256を超える数値が割り当てられている場合、256で変調され、結果をこのバイトに割り当てます。
2.バッファー付きバイトが256に割り当てられている場合、その実際の値は0になります(翻訳者の注:実際に最初のもので繰り返され、256%256 = 0)
3.フローティングポイント番号を使用して、100.7などのバッファーのバイトに値を割り当てると、実際の値はフローティングポイント番号の整数部になります-100
4.バッファ容量を超える位置に値を割り当てようとすると、割り当て操作が失敗し、バッファーは変更されません。
長さの属性を使用して、バッファーの長さを取得できます。
コードコピーは次のとおりです。
var buf = new Buffer(100);
console.log(buf.length); //-> 100
また、バッファーの長さを使用してバッファーの内容を反復し、各バイトを読み取りまたは設定することもできます。
コードコピーは次のとおりです。
var buf = new Buffer(100);
for(var i = 0; i <buf.length; i ++){
buf [i] = i;
}
上記のコードは、100バイトを含む新しいバッファを作成し、バッファ内の各バイトを0〜99に設定します。
スライスバッファーデータ
バッファが作成または受信されたら、バッファーデータの一部を抽出する必要がある場合があります。開始位置を指定して別の小さなバッファーを作成することにより、既存のバッファーを分割できます。
コードコピーは次のとおりです。
var buffer = new Buffer( "これは私のバッファーの内容です");
var smallerbuffer = buffer.slice(8、19);
console.log(smallerbuffer.toString()); //->「コンテンツ」
バッファーを分割するとき、新しいメモリが割り当てられたりコピーされたりしないことに注意してください。新しいバッファーは、親バッファーメモリを使用します。これは、特定のデータ(開始位置で指定)への参照です。この一節にはいくつかの意味があります。
まず、プログラムが親バッファーの内容を変更する場合、親バッファーとチャイルドバッファーは異なるJavaScriptオブジェクトであるため、これらの変更も関連する子供バッファに影響します。したがって、この問題を無視して潜在的なバグにつながるのは簡単です。
第二に、この方法で親バッファーから小さな子供バッファーを作成すると、操作が終了した後も親バッファーオブジェクトが保持され、ゴミ収集されません。注意しないと、メモリの漏れを簡単に引き起こします。
注:メモリの漏れが心配な場合は、スライス操作の代わりにコピー方法を使用できます。以下はコピーを紹介します。
バッファーデータをコピーします
コピーを使用して、バッファーの一部をこのような別のバッファーにコピーできます。
コードコピーは次のとおりです。
var buffer1 = new Buffer( "これは私のバッファーの内容です");
var buffer2 = new Buffer(11);
var targetStart = 0;
var sourcestart = 8;
var sourceend = 19;
buffer1.copy(buffer2、targetStart、sourcestart、sourceEnd);
console.log(buffer2.tostring()); //->「コンテンツ」
上記のコードでは、ソースバッファーの9〜20バイトをターゲットバッファーの開始位置にコピーします。
バッファーデータをデコードします
バッファーされたデータは、次のようなUTF-8文字列に変換できます。
コードコピーは次のとおりです。
var str = buf.tostring();
バッファーされたデータは、エンコードタイプを指定することにより、エンコード型データにデコードすることもできます。たとえば、バッファーをBase64文字列にデコードする場合は、これを行うことができます。
コードコピーは次のとおりです。
var b64str = buf.tostring( "base64");
ToString関数を使用すると、UTF-8文字列をBase64文字列にトランスコードすることもできます。
コードコピーは次のとおりです。
var utf8string = 'my string';
var buf = new Buffer(utf8string);
var base64string = buf.toString( 'base64')
まとめ
バイナリデータを処理する必要がある場合がありますが、ネイティブJavaScriptにはこれを行う明確な方法がないため、ノードは連続メモリブロックの操作をカプセル化するバッファクラスを提供します。 2つのバッファー間でメモリデータを分割またはコピーできます。
また、バッファを何らかのエンコードされた文字列に変換するか、文字列をバッファーに変換して各ビットにアクセスまたは処理することもできます。