ここでレイヤーの順序の説明がわかりにくいと思います。フォーマットとエンコーディングは関連しているが、それほど密接に結びついていないと考えています。正式に定義してみましょう。
ファイルは、連続した一連のバイトです。バイトは連続した一連のビットです。
シンボルはデータの単位です。バイトは記号の一種です。バイトではない他のシンボルがあります。数字の 6 を考えてみましょう。これはシンボルですが、バイトではありません。ただし、通常はバイトとしてエンコードできます00000110
(これは 6 の 2 の補数エンコードです)。
エンコーディングは、シンボルのセットを別のシンボルのセットにマップします。最も一般的には、バイト以外のシンボルのセットからバイトにマップし、ファイル全体に適用するとファイル encodingになります。2 の補数は、数値の表現を提供します。一方、たとえば ASCII は、ラテン アルファベットと関連する文字をバイト単位で表現します。ASCII をテキストの文字列に適用すると、"Hello, World!" と言うと、一連のバイトが得られます。この一連のバイトをファイルとして保存すると、ファイルは ASCII としてエンコードされます。
フォーマットは、シンボルの有効なシーケンスのセットを記述します。ファイルのバイトに適用される場合、それはファイル形式です。例として、ラスター グラフィックスを格納するための BMP ファイル形式があります。ファイル形式を BMP として識別するために最初に数バイトが必要であり、その後にイメージのサイズと深さを記述するために数バイトが続く必要があることを指定します。ファイル形式ではない形式の例は、英語での 10 進数の書き方です。基本的な形式は、一連の数字の後にオプションの小数点が続き、さらに数字が続く形式です。
テキストファイル
テキスト ファイルは、非常に単純な形式の一種のファイルです。構造がないため、フォーマットは非常にシンプルです。すぐに文字のエンコードで始まり、最後の文字のエンコードで終わります。通常、ヘッダーやフッター、メタデータなどはありません。最初からバイトを文字として解釈し始めるだけです。
しかし、ファイル内の文字をどのように解釈しますか? そこでエンコーディングの出番です。ファイルが ASCII としてエンコードされている場合、バイト01000001
はラテン文字の A を表します。UTF-8 など、はるかに複雑なエンコーディングがあります。UTF-8 では、文字は必ずしも 1 バイトで表現できるわけではありません。できる人もいれば、できない人もいます。最初のバイトの最初の数ビットから、文字として解釈するバイト数を決定します。
お気に入りのテキスト エディターでファイルを開くとき、ファイルはどのようにバイトを解釈するかを知るのでしょうか? それは興味深い問題です。テキスト エディタは、ファイルのエンコーディングを決定する必要があります。さまざまな方法でこれを試みることができます。ファイル名の拡張子からヒントが得られる場合があります (.txt
少なくとも ASCII 互換である可能性があります)。場合によっては、ファイルの最初の文字が、エンコーディングが何であるかについての良いヒントを与えてくれます。ただし、ほとんどのテキスト エディタには、ファイルをどのエンコーディングとして扱うかを指定するオプションがあります。
テキスト ファイルには形式があります。多くの場合、形式はテキストのエンコーディングから完全に独立しています。つまり、この形式は、有効なバイト シーケンスをまったく記述していません。代わりに、有効な文字シーケンスを記述します。たとえば、HTML はドキュメントをマークアップするためのテキスト ファイルの形式です。ドキュメントの内容を決定する文字のシーケンスを記述します (注: バイトのシーケンスではありません)。例として、一連の文字<html>
が開始タグであり、ある時点で終了タグが続く必要があることを示してい</html>
ます。もちろん、形式はこれよりもはるかに詳細です。
バイナリーファイル
バイナリ ファイルは、そのファイル形式によって意味が決まるファイルです。ファイル形式は、ファイル内の有効なバイト シーケンスとそのシーケンスの意味を記述します。ファイル形式レベルで重要なのはバイトの解釈ではなく、バイトの順序と配置です。
前述のように、BMP ファイル形式は、ラスター グラフィックスを格納する方法を提供します。最初の 2 バイトは である必要が01000010 01001101
あり、次の 4 バイトはファイルのサイズをバイト数のカウントとして指定する必要があるなどであり、実際のピクセル データに至ります。
バイナリ ファイルには、その中にエンコーディングを含めることができます。これを説明するために、前の例を考えてみましょう。BMP ファイルの最初の 2 バイトに続く 4 バイトは、ファイルのサイズをバイト単位で示していると言いました。これらのバイトはどのように解釈されますか? BMP ファイル形式は、これらのバイトがサイズを符号なし整数として与えると述べています。これは、それらのバイトのエンコーディングです。
では、コンピューターのディレクトリで BMP ファイルを参照して開く場合、システムはどのようにしてそのファイルを開く方法を認識しているのでしょうか? それを表示するために使用するプログラムをどのように知るのでしょうか? バイナリ ファイルの形式は、テキスト ファイルのエンコーディングよりも、ファイル拡張子によってはるかに強く示唆されます。ファイル名が.bmp
最後にある場合、システムはおそらくそれを BMP ファイルと見なし、使用しているグラフィック プログラムで開くだけです。また、最初の数バイトを調べて、それらが何を示唆しているかを確認することもできます。
概要
ファイル内のバイトの意味を理解するための最初のレベルは、そのファイルの形式です。テキスト ファイルの形式は非常に単純です。最初から始めて、最後まで文字を解釈します。文字を解釈する方法は、そのテキスト ファイルの文字エンコーディングによって異なります。ただし、ほとんどの形式はより複雑で、エンコーディングがネストされている可能性があります。あるレベルでは、バイトから抽象的な情報の抽出を開始する必要があり、そこでエンコーディングが開始されます。しかし、エンコードされているものはすべて、それに適用されるフォーマットを持つこともできます。必要な情報が得られるまで、一連の形式とエンコーディングがあります。