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

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

高洛峰
高洛峰オリジナル
2017-02-04 09:51:101609ブラウズ

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

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

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%256=0)
3. 浮動小数点の場合数値はバッファに使用されます。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 に設定します。

バッファ データの分割

バッファを作成または受信したら、バッファ データの一部を抽出する必要がある場合があります。開始位置を指定して既存のバッファを分割し、別の小さなバッファを作成できます。バッファの場合、新しいメモリの割り当てやコピーは行われません。新しいバッファは、親バッファの特定のデータ (開始位置で指定される) を参照するだけです。この一節にはいくつかの意味が含まれています。

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

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

注: メモリリークが心配な場合は、スライス操作の代わりにコピーメソッドを使用できます。以下で紹介します。

バッファ データのコピー

次のように、copy を使用してバッファの一部を別のバッファにコピーできます:

var buffer = new Buffer("this is the content of my buffer");

var smallerBuffer = buffer.slice(8, 19);
console.log(smallerBuffer.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编码、解码二进制数据详解相关文章请关注PHP中文网!

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