GIFファイルシグネチャ — マジックバイト

GIFファイルシグネチャバイトとGIF87aとGIF89aバージョンの違いを学びます。ASCIIで読み取り可能なヘッダーからhexダンプでGIF画像を識別します。

File Signatures

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サーバーに使用されます。

試してみる — Hex Editor

フルツールを開く