はじめに
expressでファイル関連の処理を実装する際に前提知識がなさすぎたので初歩的なことを調べました。
その際にメモしたものをつらつらと書いていきます(雑です
バイナリデータ
- コンピュータが見て分かる/扱えるデータ
-
binary
は「2進法の」という意味 - 具体的には画像、音楽、動画、圧縮されたファイルなど
-
- 一般的には人間が読めるテキストデータ以外のデータを指すことが多い
- バイナリとテキストは対比の意である
バイト
- 1byte = 8bit
- 1か0を並べた数値の1個をbitと言う
Buffer
- Node上でバイナリデータを扱うためのクラス
- 文字列とは全く別ものであるバイナリデータ(バイト列)を扱う
- ちなみに文、字列を扱うクラスは
String
- ちなみに、C言語ではこの両者を同じ型として扱える
-
new Buffer(128)
のような形で書くと128バイトのバッファを作成できる
ArrayBuffer
- JavaScriptでバイナリを扱うためのオブジェクトである
- 他の言語ではバイト配列と呼ばれていたりする
-
const buffer = new ArrayBuffer(30);
みたいな形で宣言できる- 引数で指定した長さの物理のメモリ空間がバイナリ保存用として確保される
-
確保されるだけで直接読み書き等の操作はできない
- 操作したい場合は
DataView
またはTypedArray
というオブジェクトをインターフェースとして使用する
- 操作したい場合は
- 例えばBase64やローカルファイルから配列バッファーを取得できる
- 参考
TypedArray
- 型付き配列を指す
-
Float32Array
やUint8Array
など型を指定して、バッファから配列を生成する - 通常の配列(Array)のように添字によってバッファにアクセス可能で「高速に」読み書きが行える
- 参考
Dataview
- TypedArrayよりも高機能なバッファ操作用クラス
Blob(Binary Large OBject)
- ① ブラウザ(WebAPI)で実装されているバイナリデータを扱うクラス
- テキストやバイナリデータとして読み込んだり、ReadableStream に変換してそのメソッドを使ったデータ処理をしたりすることができる
-
File
インターフェースはBlob
を継承していて、ファイル操作を拡張している
- ② データベースで用いられるデータ型の1つで、ビデオや音声、圧縮ファイル、実行ファイルなどの非構造化データ、プレーンテキスト(平文の文字数字)以外のバイナリデータを格納する際に用いられる
- 参考
Stream
- Node上でデータストリームを扱うためのオブジェクト
- ファイル全体をメモリに乗せて、オブジェクトに書き込むため、メモリリークやパフォーマンス問題が発生する時に使われる
- データを小分けにして順番に扱うので、同じようなデータをどっかに流したいだけ(順次読みこんで、順次書き込む)とか、配列のような順序の決まったものに対して逐次計算をしていくとかの時に使う
- 参考
Base64
- 64進数を意味する言葉で、64文字で表すエンコード方式=データの変換方式
- エンコードとは、ルールに基づいて変換することで、エンコードすることでデータを扱いしやすくしたり、使用している言語やツールで扱える形にしている
- なぜ使うか
- リクエスト数を減らす (【JavaScript入門】Base64でサイトのパフォーマンスをアップさせよう)
- より詳しく: base64ってなんぞ??理解のために実装してみた
- リクエスト数を減らす (【JavaScript入門】Base64でサイトのパフォーマンスをアップさせよう)
- 処理の流れ
- エンコードしたいファイルのバイナリデータを6bitずつ取り出す(足りない分は0を追加する)
- 6ビットとAscii文字の変換表を用いて、4文字ずつにする(4文字に満たない場合は
=
を追加する)
- 参考