マジックナンバー (フォーマット識別子)マジックナンバーとは、ファイルなどオブジェクト類の形式を識別するもの、フォーマット識別子のことである[1]。 なお、本項内でのマジックナンバーの具体的な値の表記には、特記無い限り16進表記を用いる。 概要フォーマット識別子としてのマジックナンバーとは、ファイルの種類を識別するのに使われるファイル本文中の(内容中の)特定の位置にある特定の数値のことである。ファイルの種類を識別する方法としてはファイルの拡張子や属性値(プロパティ)を使う場合もあるが、マジックナンバーとはそれらのことではなく、ファイルの本文中に表れる特定の数値のことである。ほとんどの場合、マジックナンバーはファイルの先頭に位置し、数バイト程度である。 また、ファイル以外にもデータ構造を持ったオブジェクト全般、例えば、マスターブートレコードでのファイルシステムの種類を表す識別子なども、マジックナンバーと呼ばれている。 歴史を辿るとマジックナンバーは、PDP-11のヘッダ部分に配置されている、データをスキップしてプログラムの開始位置にジャンプするインストラクションコードを意味していた[1]。例えば、ファイルの冒頭の1ワード(PDP-11は16ビットワードマシン)がリトルエンディアンの8進数で オペレーティングシステムのマジックナンバーUnix系Unix系オペレーティングシステムには複数の実行形式のバイナリフォーマットがある。a.out、COFF、ELFなどである。Unix系オペレーティングシステムが実行ファイルを実行する際、それがテキストファイルであればシェルスクリプトと見なしてシェルを呼び出し(さらにシェルは、そのファイルが「 このような仕組みから、Unix系オペレーティングシステムでは起動方法を切り替える仕組みをフックすることで、初期状態ではサポートされていないファイル形式の実行バイナリを実行することも可能となっている。例えば、BSD系での互換レイヤー(Linux互換レイヤーやSVR4互換レイヤーなど)、BSD系でのWin32カーネル互換パッケージの PEACE[2] などは、この機能の実現例である。これが実現可能であるのは、マジックナンバーやマジックナンバーに後続するフラグ類によって判断しているからである。 BSD系もLinuxもELFバイナリが用いられており、マジックナンバーは 「 Windows系MS-DOS や Windows オペレーティングシステムで使われる実行形式のバイナリーフォーマットには、COMフォーマットとEXEフォーマットの二種類があるが、EXEフォーマットは、COMフォーマットと区別するために、ファイルの先頭が アプリケーションソフトのマジックナンバーアプリケーションでも、バイナリファイルの冒頭付近に他のアプリケーション用のファイルと区別可能なマジックナンバーを設けることは一般的であり、他のアプリケーション用のファイルが読み込まれた場合の誤動作防止のためのチェック用コードとして機能している。
また、将来、ファイル形式の拡張が必要となる時のために、マジックナンバーにバージョン番号を含めておくこともしばしば行われる。
WindowsやMacintoshではマジックナンバーを参照することに特化したアプリケーションはオペレーティングシステムに付属されていないため、このような情報を利用者が参照することはあまりない。ただし、誤った拡張子が付与されているために正しいアプリケーションが開けなくなったファイルの拡張子を補正するようなソフトウェアは、マジックナンバーを参照して本来のファイル形式を判断している。なお、ファイル偽装されたファイルの復元アプリケーションではマジックナンバー以外の情報も参照しているが、ここでは単に拡張子が別のものに変わってしまったようなケースを想定して説明している。 マスターブートレコードのマジックナンバーマスターブートレコードのパーティションテーブルには、パーティションの種類を示す情報、パーティション識別子が含まれている。例えばFAT32であれば 一部のオペレーティングシステムでは、パーティション識別子の付与とフォーマットを同タイミングで行うため、この両者は一致する。Windowsでは、パーティションの作成(パーティションサイズの決定)は独立操作であるが、パーティション識別子の付与とフォーマットは単一の操作であり、同タイミングで行われる。 一方、パーティション識別子の付与とフォーマットを行うタイミングが異なり、パーティション識別子と無関係の形式でフォーマットを行うことが可能なオペレーティングシステムも存在する。これは、複数のフォーマット形式に対応したPC-UNIX全般について言える。例えば FreeBSD では、パーティション識別子の付与は その他ジャーゴンファイルでは、「既存のファイル形式と重ならないように、新しい番号をどのように決めれば良いか」「簡単である。ランダムに決めれば良い」「まさしくマジック(手品)である」と取り上げられている[1]。 脚注
関連項目Information related to マジックナンバー (フォーマット識別子) |