Node.js でバッファを使用してバイナリ データをエンコードおよびデコードする方法

不言
リリース: 2018-06-30 16:08:04
オリジナル
2556 人が閲覧しました

この記事では、Node.js でバイナリ データをエンコードおよびデコードするための Buffer の使用方法について詳しく説明します。Buffer は、ascii、utf8、ucs2、base64 などのエンコード形式をサポートしています。必要な方は参照してください。

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 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。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

nodejs中实现路由功能的方法

NodeJs基本语法和类型的介绍

深入解析node.js的exports、module.exports与ES6的export、export default

以上がNode.js でバッファを使用してバイナリ データをエンコードおよびデコードする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!