序文現代の 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 キャッシュ構成の詳細な説明
この記事では、マスク レイヤーの中空化を実現する 4 つの方法を紹介します。みんなと共有し、自分用の...
この記事では、省、市、地区の3段階選択を実現するためのjsの具体的なコードを紹介します。具体的な内容...
Docker 公式ドキュメントからの翻訳、原文: https://docs.docker.com/n...
MySQLで重複データを削除する詳細な例重複レコードには 2 つの意味があります。1 つは完全に重複...
自動検出を行う際には、ポートなどの情報を取得してjson形式で返すスクリプトが必ず存在します。Red...
この記事では、ログインタイプの切り替えを実装するためのVueの具体的なコードを例として紹介します。具...
1.MySqlをダウンロードしてインストールする公式ウェブサイトからMySqlデータベースをダウンロ...
MySQLをアンインストールする1. コントロールパネルで、MySQLのすべてのコンポーネントをア...
最初のステップ: VMwareで、「編集」-「仮想ネットワークエディタ」をクリックします。下図に示す...
1. 背景実際のプロジェクトでは、分散スケジュールされたタスク実行の状況に遭遇することがあります。ス...
目次コンセプト紹介論理的ルール完全なコード主な実装コンセプト紹介セルオートマトンとは、コンピュータの...
冒頭にこう書かれています:アブソリュートは言った。「親戚よ、私はあなたを私の人生で見たくない!」なぜ...
目次シンプルなSpringbootプロジェクトを作成する1. pom.xmlでSpring Boot...
商品を検索するときに、すべてのブランドまたは一部のブランドを表示するTaobaoの機能を真似してみま...
序文:プロジェクト開発では、一部のビジネス テーブル フィールドで日付と時刻の型が使用されることが多...