TypedArray → Blob
Blob
コンストラクタを使います。
なお、次項の方法で ArrayBuffer
にしてみると分かりますが、この時バイトオーダーはリトルエンディアンになります。
Blob → ArrayBuffer
FileReader
の readAsArrayBuffer()
を使います。onload
イベントを待つので非同期です。
ArrayBuffer → TypedArray
いずれかの TypedArray
コンストラクタを使います。ここでは例として Uint8Array
を使いました。
TypedArray → ArrayBuffer
ArrayBuffer
を参照するビューを作成して、その中に Buffer
の内容をコピーする必要があります。
Uint8Array → Uint16Array|Uint32Array
手動で変換できますが、バイトオーダーを気にする必要があります。
例えば Uint8Array([0x11, 0x22, 0xAA, 0xBB])
を Uint16Array
に変換する場合、リトルエンディアンとして扱えば Uint16Array([0x2211, 0xBBAA])
に、ビッグエンディアンとして扱えば Uint16Array([0x1122, 0xAABB])
になります。
同様に Uint8Array([0x11, 0x22, 0xAA, 0xBB])
を Uint32Array
に変換する場合、リトルエンディアンとして扱えば Uint16Array([0xBBAA2211])
に、ビッグエンディアンとして扱えば Uint16Array([0x1122AABB])
になります。
Uint16Array|Uint32Array → Uint8Array
ほぼ同上です。これも手動で変換できますが、バイトオーダーを気にする必要があります。
例えば Uint16Array([0x1122, 0xAABB])
を変換する場合、リトルエンディアンとして扱えば Uint8Array([0x22, 0x11, 0xBB, 0xAA])
に、ビッグエンディアンとして扱えば Uint8Array([0x11, 0x22, 0xAA, 0xBB])
になります。
同様に Uint32Array([0x1122AABB])
を変換する場合、リトルエンディアンとして扱えば Uint8Array([0xBB, 0xAA, 0x22, 0x11])
に、ビッグエンディアンとして扱えば Uint8Array([0x11, 0x22, 0xAA, 0xBB])
になります。
ArrayBuffer → Buffer
普通に Buffer.from()
を使います。
Buffer → ArrayBuffer
ArrayBuffer
を参照するビューを作成して、その中に Buffer
の内容をコピーする必要があります。
Buffer → TypedArray
いずれかの TypedArray
コンストラクタを使います。ここでは例として Uint8Array
を使いました。
TypedArray → Buffer
普通に Buffer.from()
を使います。
文字列 → Blob (UTF-8)
Blob
コンストラクタを使います。
上述の方法で ArrayBuffer
にしてみると分かりますが、この時 Blob
が保持するバイト列はUTF-8になってます。なのでJavaScriptの内部文字コードはUTF-16ですが、この方法で生成した Blob
をダウンロードすると文字コードはUTF-8です。
文字列 → ArrayBuffer (UTF-8)
文字列を Blob
に変換するとUTF-8になるのを利用します。
ArrayBuffer (UTF-8) → 文字列
JavaScriptの内部文字コードはUTF-16ですが、Ajaxの戻りなどでUTF-8のバイト列が手元にある場合にデコードする方法です。以下の記事を参考にさせていただきました。
javascript - Conversion between UTF-8 ArrayBuffer and String - Stack Overflow
UTF-8のバイナリ文字列を escape()
でURLエンコードした後、decodeURIComponent()
で戻すと行けるみたいです。なお、escape()
は標準機能ではなくなったそうなので、ここでは自前で移植したものを使っています。
文字列 → Buffer
Buffer.from()
を使います。デフォルトのエンコーディングはUTF-8です。
Blob → Base64文字列
FileReader
の readAsDataURL()
で生成したDataURLから、Base64文字列の部分 (最初のカンマ以降) を切り出して使います。onload
イベントを待つので非同期です。
Base64文字列 → バイナリ文字列
atob()
を使います。
バイナリ文字列 → Base64文字列
btoa()
を使います。
バイナリ文字列 → Blob
Blob
コンストラクタを使います。
バイナリ文字列 → Uint8Array
String
の charCodeAt()
を使って、文字列を1文字ずつコード値に変換します。
バイナリ文字列なので Uint8Array
を使ってます。JavaScriptのコード内に書かれた文字列の場合は文字列 → Uint16Arrayを使ってください。
Uint8Array → バイナリ文字列
全部いっぺんに String.fromCharCode()
に渡して変換できます。
文字列 → Uint16Array
JavaScriptの内部文字コードはUTF-16 (コード値 0 ~ 65535) なので、Uint16Array
なら格納できます。
Uint16Array → 文字列
全部いっぺんに String.fromCharCode()
に渡して変換します。いっぺんに渡さないと、サロゲートペア使用文字がちゃんと戻りません。
Blob → Image
Blob
の画像データを <img>
の src
に使えます。オブジェクトURLを使う方法とデータURLを使う方法があります。どちらも onload
イベントを待つので非同期です。
オブジェクトURLの場合は、URL.createObjectURL()
を使います。
データURLを使う場合は、下記のコードです。
Image → Canvas
変換というかですが、Canvasにそのまま描画してしまいます。コンテキストの drawImage()
を使います。
Canvas → Image
Canvasの toDataURL()
を使います。onload
イベントを待つので非同期です。
Canvas → Blob
Canvasの toBlob()
を使えば一発です。toBlob()
は非同期の関数で、コールバックに Blob
が渡されます。
Canvas → Base64文字列
Canvasの toDataURL()
で生成したDataURLから、Base64文字列の部分を切り出して使います。