バイトオーダー(エンディアンとも呼ばれます)は、より大きな値を構成するバイトがどの順番で保存されているかを表します。コンピュータは、そのバイト列を書き込む際にどちら側からでも始めることができるため、ファイルはどちらの端から書いたかを示しておく必要があります。そうすることで、後からそのファイルを読む側が同じ数値を正しく復元できます。
2つのバイト順序
1バイトだけで表せる値なら、解釈の余地はありません。1バイトでは収まらない大きな数値は複数のバイトに分割して保存する必要があり、そのときに2つの方式の違いが現れます。
- ビッグエンディアン: 最上位ビットを含むバイトから保存または送信を開始し、その後は重要度が順に下がっていく方式
- リトルエンディアン: 最下位ビットを含むバイトから保存または送信を開始し、その後は重要度が順に上がっていく方式
2バイトが必要な数値 4660 を例にします。ビッグエンディアンのファイルでは 12 34、リトルエンディアンのファイルでは 34 12 のように書き込まれます。同じ数値でも、順番は逆です。混在型の形式も存在し、mixed-endian や middle-endian と呼ばれますが、これはまれです。主要な2つのバイトオーダーはどちらも日常的に使われており、どちらになるかはそのファイルを作成したデバイスやアプリによって決まります。
どのファイルがそれを持っているか
このフィールドは TIFF および TIFF 構造を基盤とするあらゆる形式でよく見られます。そこには、JPEG 写真内の Exif メタデータブロックや、NEF、CR2、ARW、DNG といったカメラの RAW 形式も含まれます。これらのファイルは先頭に 2 文字のマーカーを持ち、Intel プロセッサ由来の II、Motorola プロセッサ由来の MM のいずれかで始まります。レポートでは通常、Little-endian (Intel, II) や Big-endian (Motorola, MM) のように書き分けます。どちらを使うかは、そのメタデータを書き込んだカメラ、スキャナ、またはアプリが選択しています。
オーディオコンテナ形式でも、フォーマット全体のレベルで同じ選択が行われています。WAV は値をリトルエンディアンで、AIFF はビッグエンディアンで保存します。そのため、まったく同じ音声サンプルを含んでいても、この2つの形式はバイト単位では互換性がありません。
ファイルにとって重要な理由
バイトオーダーは、あるマシンで書かれたメタデータが別のマシンでは意味不明に見える原因です。マーカーを無視したり、誤ったバイトオーダーを前提にして読み取ると、単に丁寧にエラーになるわけではありません。不可能な日付や、あり得ない露出値、ファイル末尾を超える長さなどを生み出したり、メタデータ全体を読めないと判断したりします。バイトオーダーを知ることで、そのファイルをどのように開き、正しく処理できるかが分かります。
メタデータを編集する場合、この重要性はさらに高まります。新しい値は、ファイルが宣言しているバイトオーダーに従って書き戻さなければならないからです。さらに、そのマーカー自体が壊れてしまうと、ファイル内の画像や音声データが完全に無傷でも、メタデータブロック全体が読めなくなることがよくあります。このフィールドはあくまでファイルのレイアウト方法だけを示すものであり、あなたやあなたのデバイスに関する個人情報は一切含みません。