Node.js で Buffer を使用してバイナリ データをエンコードおよびデコードする方法の詳細な説明
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 = 'my string'; var buf = new Buffer(utf8String); var base64String = buf.toString('base64')
小结
有时候,你不得不跟二进制数据打交道,但是原生JavaScript又没有明确的方式来做这件事,于是Node提供了Buffer类,封装了一些针对连续内存块的操作。你可以在两个缓冲之间切分或复制内存数据。
你也可以把一个缓冲转换成某种编码的字符串,或者反过来,把一个字符串转化成缓冲,来访问或处理每个bit。
更多Node.js中使用Buffer编码、解码二进制数据详解相关文章请关注PHP中文网!

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

この記事では、ブラウザ開発者ツールを使用した効果的なJavaScriptデバッグについて説明し、ブレークポイントの設定、コンソールの使用、パフォーマンスの分析に焦点を当てています。

この記事では、ソースマップを使用して、元のコードにマッピングすることにより、Minified JavaScriptをデバッグする方法について説明します。ソースマップの有効化、ブレークポイントの設定、Chrome DevtoolsやWebpackなどのツールの使用について説明します。

この記事では、Javaのコレクションフレームワークの効果的な使用について説明します。 データ構造、パフォーマンスのニーズ、スレッドの安全性に基づいて、適切なコレクション(リスト、セット、マップ、キュー)の選択を強調しています。 コレクションの使用を効率的に最適化します

エントリーレベルのタイプスクリプトチュートリアルをマスターしたら、TypeScriptをサポートするIDEで独自のコードを作成し、JavaScriptにコンパイルできるはずです。このチュートリアルは、TypeScriptのさまざまなデータ型に飛び込みます。 JavaScriptには、NULL、未定義、ブール値、数字、文字列、シンボル(ES6によって導入)とオブジェクトの7つのデータ型があります。 TypeScriptはこれに基づいてより多くのタイプを定義し、このチュートリアルではすべてを詳細に説明します。 ヌルデータ型 JavaScriptのように、Typescriptのnull

このチュートリアルでは、chart.jsを使用してパイ、リング、およびバブルチャートを作成する方法について説明します。以前は、4つのチャートタイプのchart.js:ラインチャートとバーチャート(チュートリアル2)、およびレーダーチャートと極地域チャート(チュートリアル3)を学びました。 パイとリングチャートを作成します パイチャートとリングチャートは、さまざまな部分に分かれている全体の割合を示すのに理想的です。たとえば、パイチャートを使用して、サファリの男性ライオン、女性ライオン、若いライオンの割合、または異なる候補者が選挙で受け取る票の割合を示すことができます。 パイチャートは、単一のパラメーターまたはデータセットの比較にのみ適しています。パイチャートのファンの角度はデータポイントの数値サイズに依存するため、パイチャートは値のあるエンティティをゼロ値で描画できないことに注意してください。これは、割合がゼロのエンティティを意味します
