GIFファイルシグネチャ — マジックバイト
GIFファイルシグネチャバイトとGIF87aとGIF89aバージョンの違いを学びます。ASCIIで読み取り可能なヘッダーからhexダンプでGIF画像を識別します。
Hex
47 49 46 38 39 61
ASCII
GIF89a
詳細な説明
GIF(Graphics Interchange Format)ファイルは、最も人間が読みやすいマジックバイトシグネチャの1つを持っています: ASCII文字列GIF87aまたはGIF89aです。16進数では、GIF89aシグネチャは47 49 46 38 39 61、GIF87aは47 49 46 38 37 61です。6バイトのシグネチャにはフォーマット識別子とバージョン番号の両方が含まれています。
バイトごとの内訳(GIF89a):
| オフセット | Hex | ASCII | 意味 |
|---|---|---|---|
| 0 | 47 |
G | フォーマット識別子 |
| 1 | 49 |
I | |
| 2 | 46 |
F | |
| 3 | 38 |
8 | バージョン年代 |
| 4 | 39 |
9 | バージョン年 |
| 5 | 61 |
a | バージョンサフィックス |
GIF87aとGIF89aの違い:
元のGIF仕様(1987年)はシグネチャGIF87aを使用していました。1989年の更新版GIF89aでは、アニメーション(タイミング制御付きの複数フレーム)、透明度(1つのカラーインデックスを透明として指定)、テキストオーバーレイのサポートが追加されました。現在使用されているGIFファイルのほぼすべてがGIF89aです。Webでアニメーションを見る場合、フレーム遅延とディスポーザル方法にGIF89a拡張ブロックが使用されています。
シグネチャの後 — 論理スクリーン記述子:
シグネチャに続くバイト6-12には論理スクリーン記述子が含まれます:
- バイト6-7: キャンバス幅(リトルエンディアン16ビット)
- バイト8-9: キャンバス高さ(リトルエンディアン16ビット)
- バイト10: パックドバイト(グローバルカラーテーブルフラグ、色解像度、ソートフラグ、グローバルカラーテーブルのサイズ)
- バイト11: 背景色インデックス
- バイト12: ピクセルアスペクト比
グローバルカラーテーブル:
バイト10でグローバルカラーテーブルフラグが設定されている場合、カラーテーブルは記述子の直後に続きます。各エントリは3バイト(RGB)で、エントリ数は2^(N+1)です(Nは「グローバルカラーテーブルのサイズ」フィールド、0-7)。N=7のテーブルには256色(合計768バイト)が含まれます。
GIFシグネチャが特別な理由:
ほとんどのバイナリ形式とは異なり、GIFシグネチャは完全に印字可能なASCII文字で構成されており、hexダンプとプレーンテキストビューの両方で即座に認識できます。テキストエディタでGIFファイルを開くと、最初の6文字が明確に"GIF89a"または"GIF87a"と読めます。
ユースケース
GIFマジックバイト識別は、フォーマットを自動検出する画像処理パイプライン、アニメーションと静止画像を識別するコンテンツモデレーションシステム、コンテンツネゴシエーションを実行するWebサーバーに使用されます。