序文現代の JavaScript はより複雑なシナリオに直面する必要があり、バイナリ転送を含むより多くの種類のデータ転送があります。データ処理を容易にし、効率を向上させるために、ArrayBuffer オブジェクトが作成されました。 しかし、実際に使ってみると、ArrayBuffer だけでなく、TypedArray、DataView、Blob、FileReader などの一連のオブジェクトがあり、それらの関係について混乱してしまうことがあります。なぜこんなにたくさんの物体があるのですか?私はこれらの疑問を念頭に置いて情報を検索し、関係性を整理しようとしました。 さまざまなオブジェクト間の関係配列バッファArrayBuffer は JavaScript で最も基本的なバイナリ オブジェクトであり、連続したメモリ空間をバイト単位で記述します。 定数バッファ = 新しいArrayBuffer(32); このようにして、32 バイトのメモリ領域を作成し、buffer.byteLength を使用してその長さを確認できます。 ArrayBuffer オブジェクトで実行できる操作は非常に少なく、編集もできません。データを編集する必要がある場合は、TypedArrayと データビュー。 型付き配列TypedArray は型付き配列です。TypedArray 自体はデータを保存しませんが、ArrayBuffer データを表示するために特に使用されます。そのため、TypedArray と呼ばれます。これは特定のコンストラクターの名前ではなく、コンストラクターのグループの一般的な名前です。
作成時に、length、typedArray、ArrayBuffer、array を渡すことができます。もちろん、何も渡さないこともできます。 定数uint1 = 新しいUint8Array(8); 定数 uint2 = 新しい Uint16Array(新しい Uint8Array(8)); const uint3 = 新しい Uint8Array(新しい ArrayBuffer(8)); 定数uint4 = 新しいUint8Array([1, 2, 3]); const uint5 = 新しい Uint8Array(); 上記の typedArray では、作成時に渡された ArrayBuffer を除いて、新しいプロセス中に最下層に新しい ArrayBuffer が作成されます。 arr.buffer を使用して、参照する ArrayBuffer にアクセスできます。 通常の配列に対するすべての操作は TypedArray でも使用できます。しかし、ArrayBuffer は連続したメモリ範囲を記述するため、値を削除することはできず、0 を割り当てることしかできません。concat メソッドを使用する方法はありません。 Uint8ClampedArrayUint8ClampedArray は少し特殊で、正のオーバーフローと負のオーバーフローを異なる方法で処理します。 その他の範囲外データについては、右端(最下位ビット)部分のみが保持され、オーバーフローデータは破棄されます。ただし、Uint8ClampedArray では、範囲外データは 255 として保存され、負の数は 0 として保存されます。 文字間の変換TypedArray は文字列を直接渡さないので、最初に文字列をトランスコードする必要があります。 文字列 → Unit8Array const 文字列 = "こんにちは"; Uint8Array.from(string.split(""), (e) => e.charCodeAt(0)); Unit8Array → 文字列 // TextDecoder オブジェクトを使用します const u8 = Uint8Array.of(72, 101, 108, 108, 111); 新しい TextDecoder().decode(u8); // fromCharCode を使用して変換 const u8 = Uint8Array.of(72, 101, 108, 108, 111); Array.from(u8, (e) => String.fromCharCode(e)).join(""); データビューuint2 変数を除き、上記のデータはすべて単一のデータ型です。uint2 オブジェクトは、複合ビューと呼ばれる 1 つのメモリ セクションに 2 種類のデータを格納します。 JavaScript のデータ型はそれほど単純ではないことが多く、TypedArray だけで操作すると面倒になるため、DataView オブジェクトがあります。 DataView には TypedArray よりも多くの操作メソッドがあります。 const バッファ = 新しいArrayBuffer(8); const dataView = 新しい DataView(バッファ); getInt8、getUint8、getInt16、getUint16、getInt32、getUint32、getFloat32、getFloat64 メソッドを提供します。 パラメータは 2 つあり、最初のパラメータはセクションの位置、2 番目のパラメータはバイト順序ですが、これは必須ではありません。戻り値は対応する位置のバイトデータです。 定数d1 = dataView.getUint8(1); 定数 d2 = dataView.getUint8(1, true); バイト位置は分かりやすく、バイト順序は「バイト順序の理解」で読むことができます。一般的には、次のようになります。
デフォルトでは、ビッグ エンディアン バイト オーダーが使用されます。リトルエンディアン バイト オーダーを使用する場合は、true を渡す必要があります。 このようにして、基本的なバイナリの読み取りおよび書き込みソリューションが得られます。ただし、実際のアプリケーション シナリオではより複雑なデータが含まれることが多いため、Blob や FileReader などのオブジェクトは特定のシナリオに合わせて派生されます。 ブロブBlob は Binary Large Object の略です。 ArrayBuffer と Blob の違いは、ArrayBuffer は純粋なバイナリ データであるのに対し、Blob は MIME タイプを持つバイナリ データである点です。また、String、ArrayBuffer、TypedArray、DataView、Blob から Blob オブジェクトを簡単に生成できます。 const blob1 = new Blob(["hello"], { type: "text/plain" }); const blob2 = new Blob([new Uint8Array([72, 101, 108, 108, 111]), " ", "world"], { type: "text/plain" }); 財産:
方法:
メールアドレス開発中は、画像のバイナリデータを取得し、それを base64 に変換して src に書き込むことができますが、データ量が多い場合やビデオデータの場合は、許容される長さを超えてしまいます。 URL.createObjectURL を使用すると、リソース URL を簡単に作成できます。 定数 url = URL.createObjectURL(blob1); blob:https://example.com/a6728d20-2e78-4497-9d6c-0ed61b93f11e のようなリソース URL が生成され、これを src に直接書き込んで使用できます。 使用されていないときに参照を破棄し、メモリ使用量を解放するには、URL.revokeObjectURL(url) を使用します。 データの読み取りデータを表示するには、2 つの方法があります。 最初のメソッドは、Response オブジェクトを使用して文字列データまたは arrayBuffer データを直接読み取ります。 const responseText = 新しい Response(blob2).text() を待機します。 const responseBuf = 新しい Response(blob2).arrayBuffer() を待機します。 2 番目の方法では、FileReader オブジェクトを使用します。 const リーダー = 新しい FileReader(); reader.onload = 関数 (e) { console.log(リーダーの結果); }; リーダー。テキストとして読み込みます(blob2)。 ファイルFile は Blob から継承し、ファイル関連の属性情報を追加します。
ファイルリストFileList オブジェクトは、File オブジェクトのコレクションです。通常、次の場所に表示されます:
財産:
方法:
ファイルリーダーFileReader は Blob セクションで説明しました。実際、FileReader オブジェクトは、拡張された File オブジェクトを含む Blob オブジェクトを読み取るために特に使用されます。 財産:
イベント:
方法:
上記の例のように、データはテキスト形式で返されます。 const リーダー = 新しい FileReader(); reader.onload = 関数 (e) { console.log(リーダーの結果); }; リーダー。テキストとして読み込みます(blob2)。 関連資料
要約するこれで、JavaScript のさまざまなバイナリ オブジェクト関係に関するこの記事は終了です。JS バイナリ オブジェクト関係に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 |
<<: MySQLで時間別データと最後の時間別データの差をクエリするアイデアの詳細な説明
>>: Nginx ベースの Mencached キャッシュ構成の詳細な説明
序文以前のプロジェクトでは、SQL の CASE WHEN ソート関数が使用されました。ではブログメ...
目次docker システム df docker システム プルーンNoneオブジェクトをクリーンアッ...
Docker の作成Docker Compose は、管理対象コンテナをプロジェクト、サービス、コン...
目次序文InnoDB ストレージ アーキテクチャInnodb テーブルスペースインドストレージディス...
Nginxはまず、設定ファイル内のどのserver{}ブロックを処理に使用するかを決定します。次のs...
目次分割代入を使用したオブジェクトパラメータコールバック関数の命名条件文を説明的にするスイッチ文をM...
1. 重複行を見つける blog_user_relation a から * を選択 WHERE (...
まだ rem フレキシブルレイアウトを使用していますか?圧縮された js コードの大きなセクションを...
SPA を構築する場合、多くの場合、特定のルートを保護する必要があります。たとえば、認証されたユーザ...
目次リスナー1.ウォッチエフェクト2.見る1.1 聴くための最初の方法1.2 聞く2つ目の方法1.3...
以下は、docker の golang イメージに基づいて ssh サービスを構築するためのコードで...
成果を達成する実装コードhtml <div class="コンテナ">...
この記事では主に、CSS3 LESS で長いテキストの影を実装する方法を紹介し、皆さんと共有します。...
目次このシリーズの背景概要PostgreSQL データベースの準備ソースからインストール仮想環境の作...
序文Linux 運用保守エンジニアとして、日々の業務の中で Linux サーバーの CPU 負荷が ...