ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js_node.js?1.1.2 でバッファを使用してバイナリ データをエンコードおよびデコードする方法の詳細な説明

Node.js_node.js?1.1.2 でバッファを使用してバイナリ データをエンコードおよびデコードする方法の詳細な説明

PHP中文网
PHP中文网オリジナル
2016-05-16 16:39:401449ブラウズ

JavaScript は文字列の処理には非常に優れていますが、もともと HTML ドキュメントを処理するように設計されているため、バイナリ データの処理はあまり得意ではありません。 JavaScript にはバイト型も構造化型もバイト配列もなく、数値と文字列だけがあります。 (原文: JavaScript にはバイト型がありません — 数値があるだけです — または構造化型、あるいは http://skylitecellars.com/ バイト配列でも: 文字列があるだけです。)

Because Node is JavaScript に基づいているため、当然 HTTP などのテキスト プロトコルを処理できますが、これを使用してデータベースと対話したり、画像やファイルのアップロードを処理したりすることもできます。文字列だけを使用してこれらのことを行うのがどれほど難しいか想像できるでしょう。以前、Node はバイトをテキスト文字にエンコードすることでバイナリ データを処理していましたが、このアプローチは実行不可能で、リソースを無駄にし、遅く、柔軟性に欠け、保守が難しいことが後に判明しました。

ノードにはバイナリ バッファ実装 Buffer があり、この疑似クラスはバイナリ データを処理するための一連の API を提供し、バイナリ データの処理を必要とするタスクを簡素化します。バッファの長さはバイトデータの長さによって決まり、バッファ内のバイトデータをランダムに設定したり取得したりできます。

注: Buffer クラスには特別な点があり、バッファ内のバイト データによって占有されるメモリは JavaScrp

It VM メモリ ヒープには割り当てられません。つまり、これらのオブジェクトはJavaScript のガベージ コレクション アルゴリズムによって処理されず、変更されない永続的なメモリ アドレスに置き換えられます。これにより、バッファ内容のメモリ コピーによる CPU の浪費も回避されます。

バッファの作成

次のように、UTF-8 文字列からバッファを作成できます:

コードは次のとおりです。 :

var buf = new Buffer(‘Hello World!');


指定したエンコーディングの文字列でバッファを作成することもできます:

コードは次のとおりです:

var buf = new Buffer('8b76fde713ce', 'base64');

許容される文字エンコーディングと識別子は次のとおりです:

1.ascii - ASCI、ASCII 文字セットにのみ適用されます。
2.utf8 - UTF-8 は、Unicode 文字セットのあらゆる文字に適した可変幅エンコーディングであり、Web の世界で推奨されるエンコーディングであり、Node のデフォルトのエンコーディング タイプでもあります。
3.base64——Base64、このエンコーディングはバイナリ データを表す 64 個の印刷可能な ASCII 文字に基づいています。Base64 は通常、文字列に変換できるバイナリ データを埋め込むために使用され、必要に応じてロスレス変換を完了できます。元のバイナリ形式に戻します。

バッファを初期化するデータがない場合は、指定した容量で空のバッファを作成できます:

コードは次のとおりです:

var buf = new Buffer(1024); // 创建一个1024字节的缓冲

バッファ データの取得と設定

バッファ オブジェクトを作成または受信した後、[] 演算子を使用してバッファの特定のバイトにアクセスできます。 :

コードは次のとおりです:

var buf = new Buffer('my buffer content');
// 访问缓冲内第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%6=0)
3. A を使用する場合。浮動小数点数は、100.7 などのバッファ内の特定のバイトに値を割り当てます。100
4 を超える値を割り当てようとすると、実際の値は浮動小数点数の整数部分になります。バッファ容量が不足している場合、割り当て操作は失敗します。バッファはまったく変更されません。

length 属性を使用してバッファの長さを取得できます:

コードは次のとおりです:

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("this is the content of my buffer");
var smallerBuffer = buffer.slice(8, 19);
console.log(smallerBuffer.toString()); // -> "the content"

バッファを分割するとき、新しいメモリが割り当てられたり、コピーされたりしないことに注意してください。の場合、新しいバッファは親バッファのメモリを使用します。これは、親バッファの特定のデータ (開始位置で指定される) への参照にすぎません。この一節にはいくつかの意味が含まれています。

まず、プログラムが親バッファーの内容を変更すると、これらの変更は関連する子バッファーにも影響します。親バッファーと子バッファーは異なる JavaScript オブジェクトであるため、無視するのは簡単です。この問題により、いくつかの潜在的なバグが発生します。

次に、この方法で親バッファーから小さな子バッファーを作成すると、親バッファー オブジェクトは操作の完了後も保持され、注意しないとガベージ コレクションされません。 , メモリリークが発生しやすいです。

注意:如果你担心因此产生内存泄露问题,你可以使用copy方法来替代slice操作,下面将会介绍copy。

复制缓冲数据

你可以像这样用copy将缓冲的一部分复制到另外一个缓冲:

 代码如下:

var buffer1 = new Buffer("this is the content of my 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()); // -> "the content"

上面代码,复制源缓冲的第9到20个字节到目标缓冲的开始位置。

解码缓冲数据

缓冲数据可以这样转换成一个UTF-8字符串:

代码如下:

var str = buf.toString();

还可以通过指定编码类型来将缓冲数据解码成任何编码类型的数据。比如,你想把一个缓冲解码成base64字符串,可以这么做:

 代码如下:

var b64Str = buf.toString("base64");

使用toString函数,你还可以把一个UTF-8字符串转码成base64字符串:

代码如下:

var utf8String = &#39;my string&#39;;
var buf = new Buffer(utf8String);
var base64String = buf.toString(&#39;base64&#39;)

小结

有时候,你不得不跟二进制数据打交道,但是原生JavaScript又没有明确的方式来做这件事,于是Node提供了Buffer类,封装了一些针对连续内存块的操作。你可以在两个缓冲之间切分或复制内存数据。

你也可以把一个缓冲转换成某种编码的字符串,或者反过来,把一个字符串转化成缓冲,来访问或处理每个bit。

以上就是Node.js中使用Buffer编码、解码二进制数据详解_node.js?1.1.2的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。